BZOJ 1367 [Baltic2004]sequence 解题报告
BZOJ 1367 [Baltic2004]sequence
Description
给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots<z_N\),使得\(R=|t_1-z_1|+|t_2-z_2|+\dots+|t_N-z_N|\)的值最小,本题中,我们只需求出这个最小的\(R\)值
Input
第\(1\)行为\(N(1\le N\le10^6)\)
第\(2\)行到第\(N+1\)行,每行一个整数。第\(K+1\)行为\(t_k(0\le t_k \le 2\times 10^9)\)
思路:
如果我们需要求一个非递减的\(z\)
考虑特殊情况
注意到对一个递增的序列,有\(z_i=t_i\)
对一个递减的序列,有\(z_i\)为\(t_i\)的中位数
所以猜测可以找到一种区间的划分,使每一段区间的\(z_i\)都是这段区间\(t_i\)的中位数
感性理解一下感觉是对的。
实现起来需要动态维护末尾的区间的中位数,我们每次新进一个元素的时候,自己成一个区间,然后比一下和末尾的区间的中位数,比\(\text{Ta}\)小就合并了。注意到可以用堆维护中位数,然后合并就可并堆了。
最后一点,上面的情况都是针对非递减的情况,改成递增也很简单,把\(t_i=t_i-i\)就行了,感性理解一下似乎挺容易的。
Code:
#include <cstdio>
#include <cmath>
#include <algorithm>
#define ll long long
const int N=1e6+10;
int n,m,dis[N],key[N],rig[N],root[N],siz[N],ch[N][2];
#define ls ch[x][0]
#define rs ch[x][1]
int Merge(int x,int y)
{
if(!x||!y) return x+y;
if(key[x]<key[y]) std::swap(x,y);
rs=Merge(rs,y);
if(dis[ls]<dis[rs]) std::swap(ls,rs);
dis[x]=dis[rs]+1;
siz[x]=siz[ls]+siz[rs]+1;
return x;
}
void maintain()
{
int x;
while(rig[m]-rig[m-1]+1>>1<siz[x=root[m]])
root[m]=Merge(ls,rs);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",key+i),key[i]-=i;
++m,rig[m]=root[m]=i,siz[i]=1;
while(key[root[m-1]]>key[root[m]])
root[m-1]=Merge(root[m-1],root[m]),rig[m-1]=rig[m],--m,maintain();
}
ll ans=0;
for(int i=1;i<=m;i++)
for(int j=rig[i-1]+1;j<=rig[i];j++)
ans=ans+abs(key[j]-key[root[i]]);
printf("%lld\n",ans);
return 0;
}
2018.12.10
BZOJ 1367 [Baltic2004]sequence 解题报告的更多相关文章
- BZOJ 1367: [Baltic2004]sequence [可并堆 中位数]
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1111 Solved: 439[Submit][ ...
- bzoj 1367: [Baltic2004]sequence
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Description Input Output 一个整数R Sa ...
- BZOJ 1367 [Baltic2004]sequence (可并堆)
题面:BZOJ传送门 题目大意:给你一个序列$a$,让你构造一个递增序列$b$,使得$\sum |a_{i}-b_{i}|$最小,$a_{i},b_{i}$均为整数 神仙题.. 我们先考虑b不递减的情 ...
- 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)
1367: [Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Ou ...
- BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Submit: 521 Solved: 159 [ Subm ...
- 1367: [Baltic2004]sequence
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1090 Solved: 432 [Submit ...
- USACO Section2.1 Sorting a Three-Valued Sequence 解题报告
sort3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- 【BZOJ】1367: [Baltic2004]sequence
题意 给\(n(n \le 10^6)\)个数的序列\(a\),求一个递增序列\(b\)使得\(\sum_{i=1}^{n} |a_i-b_i|\)最小. 分析 神题啊不会. 具体证明看黄源河论文&l ...
- timus 1175. Strange Sequence 解题报告
1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...
随机推荐
- 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型
人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...
- 2018百度之星开发者大赛-paddlepaddle学习(二)将数据保存为recordio文件并读取
paddlepaddle将数据保存为recordio文件并读取 因为有时候一次性将数据加载到内存中有可能太大,所以我们可以选择将数据转换成标准格式recordio文件并读取供我们的网络利用,接下来记录 ...
- 【洛谷】题解 P1056 【排座椅】
题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数 ...
- 深度学习-tensorflow学习笔记(2)-MNIST手写字体识别
深度学习-tensorflow学习笔记(2)-MNIST手写字体识别超级详细版 这是tf入门的第一个例子.minst应该是内置的数据集. 前置知识在学习笔记(1)里面讲过了 这里直接上代码 # -*- ...
- 简单主机批量管理工具(这里实现了paramiko 用su切换到root用户)
项目名:简单主机批量管理工具 一.需求 1.主机分组 2.可批量执行命令.发送文件,结果实时返回,执行格式如下 batch_run -h h1,h2,h3 -g web_clusters,db_ ...
- ASP.NET 异步Web API + jQuery Ajax 文件上传代码小析
该示例中实际上应用了 jquery ajax(web client) + async web api 双异步. jquery ajax post $.ajax({ type: "POST&q ...
- 爬虫:Scrapy12 - Stats Collection
Scrapy 提供了方便的收集数据的机制.数据以 key/value 方式存储,值大多是计数值.该机制叫做数据收集器(Stats Collector),可以通过 Crawler API 的属性 sta ...
- ElasticSearch之CURL操作(有空再去整理)
https://www.cnblogs.com/jing1617/p/8060421.html ElasticSearch之CURL操作 CURL的操作 curl是利用URL语法在命令行方式下工 ...
- Java接口interface,匿名内部类
接口 1.接口内部为 常量+公用的抽象方法.类必须实现接口中的所有方法 2.接口的语法格式:不写abstract会自动添加,可以继承多个接口 修饰符不能使private,protected [修饰符] ...
- MacOS下安装BeautifulSoup库及使用
BeautifulSoup简介 BeautifulSoup库是一个强大的python第三方库,它可以解析html进行解析,并提取信息. 安装BeautifulSoup 打开终端,输入命令: pip3 ...