【XSY2985】【BZOJ1367】【Baltic2004】sequence
时间:2019-08-22
本文章向大家介绍【XSY2985】【BZOJ1367】【Baltic2004】sequence,主要包括【XSY2985】【BZOJ1367】【Baltic2004】sequence使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
考虑两种情况:
1.\(a_1\)<\(a_2\)<\(a_3\)<\(a_4\)...<\(a_n\)
直接令\(b_i\)=\(a_i\),最小。
2.\(a_1\)>\(a_2\)>\(a_3\)>\(a_4\)...>\(a_n\)
初一的一道绝对值题是这题的弱化版。
给定\(a_1\),\(a_2\)...\(a_n\),求一点x,使得\(abs(a_1-x)\)+\(abs(a_2-x)\)...+\(abs(a_n-x)\)值最小
直接求中位数即可(初一的知识——绝对值)
同理,关于2.我们令\(b_i\)取1到i中位数即可。
那么这道题我们就可以看做是许多个严格递减的序列,每一个序列的答案我们是可以知道的。所以我们所要做的就是合并答案即可。
怎么维护每一次合并呢?
我们想到了左偏树。
对于左偏树,我们每放入一个新节点,我们就\(-=i\),使得原应严格下降的序列变成\(a_{i-1}>=a_i\),再判断新加入的节点是否符合这个规则,不符合就与上一个merge。
因为我们是要求中位数,所以节点的size不应超过它的范围的二分之一再\(+1\),所以我们要一直\(size--\),同时删除这个节点。
最后我们求答案即可。
注:因为我们一开始就减去了i,所以在如果要输出序列是要加上i。
#include<bits/stdc++.h>
using namespace std;
struct data
{
int l,r,size,fa,val;
}s[1000001];
int val[1000001],n,k,cnt,ch[1000001][2],dis[1000001];
long long ans;
int merge(int x,int y)
{
if(!x||!y)
{
return x+y;
}
if(val[x]<val[y])
{
swap(x,y);
}
ch[x][1]=merge(ch[x][1],y);
if(dis[ch[x][0]]<dis[ch[x][1]])
{
swap(ch[x][0],ch[x][1]);
}
dis[x]=dis[ch[x][1]]+1;
return x;
}
int read()
{
char ch=getchar();
int sum=0,f=1;
while(ch<'0'||ch>'9')
{
if(ch=='-')
{
f=-1;
}
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
sum=sum*10+ch-'0';
ch=getchar();
}
return sum*f;
}
int main()
{
n=read();
dis[0]=-1;
for(int i=1;i<=n;i++)
{
val[i]=read();
val[i]-=i;
}
for(int i=1;i<=n;i++)
{
s[++cnt]=(data){
i,i,1,i,val[i]
};
while(cnt!=1&&s[cnt-1].val>s[cnt].val)
{
cnt--;
s[cnt].fa=merge(s[cnt].fa,s[cnt+1].fa);
s[cnt].size+=s[cnt+1].size;
s[cnt].r=s[cnt+1].r;
while(s[cnt].size>(s[cnt].r-s[cnt].l+3)/2)
{
s[cnt].size--;
s[cnt].fa=merge(ch[s[cnt].fa][0],ch[s[cnt].fa][1]);
}
s[cnt].val=val[s[cnt].fa];
}
}
int m=1;
for(int i=1;i<=n;i++)
{
if(i>s[m].r)
{
m++;
}
ans+=abs(s[m].val-val[i]);
}
printf("%lld\n",ans);
m=1;
for(int i=1;i<=n;i++)
{
if(i>s[m].r)
{
m++;
}
printf("%d ",s[m].val+i);
}
return 0;
}
原文地址:https://www.cnblogs.com/2017gdgzoi44/p/11379621.html
- objective-C 的OOP(上)--类定义、继承及方法调用
- jQuery打造智能提示插件二(可编辑下拉框)
- Nicholas Christakis:朋友多是由基因决定的?
- WPF中的MatrixTransform
- kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)
- ruby学习笔记(3)--语法层面的先见之明
- jQuery操作Select
- ruby学习笔记(11)--symbol与hash参数
- zabbix监控-基本原理介绍
- OpenStack构架知识梳理
- mysql操作命令梳理(4)-grant授权和revoke回收权限
- 问未来
- ruby on rails + mysql 开发环境搭建
- CentOS 7.2下安装Mono 5.0
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- (25)Bash数值运算与运算符
- (27)正则表达式
- (28)字符截取命令cut、printf
- (29)字符截取命令awk
- RTSP协议视频平台EasyNVR流媒体服务器音频播放完毕后,视频为什么也会卡住?
- Redis | Redis 有序集合相关命令
- TypeScript 4.0正式发布!现在是开始使用它的最佳时机
- 微服务开源框架TARS 之 基础组件
- Gitlab-ci:从零开始的前端自动化部署
- 从 1 到 0 构建博客项目(导读)
- 应该在JavaScript中使用Class吗
- Go语言小书 | 关于编译和语法
- Go语言小书 | 小试牛刀,从hello world开始
- 3分钟短文 | Laravel 中间件传递数据到控制器
- 3分钟短文 | Laravel 表单验证数组的数据