1367: [Baltic2004]sequence

Time Limit: 20 Sec  Memory Limit: 64 MB
Submit: 1111  Solved: 439
[Submit][Status][Discuss]

Description

Input

Output

一个整数R

Sample Input

7
9
4
8
20
14
15
18

Sample Output

13

HINT

所求的Z序列为6,7,8,13,14,15,18.
R=13


这里是hyh的题解及严谨证明

这里是Candy?的做法及证(瞎)明(猜):

貌似可以在坐标系里画出来啊

<好烦啊先不管了

如果a递增,那就是0啊

如果只能选一个纵坐标,那一定是a的中位数啊(反证应该谁都会吧)

但本题给了我们更多的机会,往左可以多选几个比中位数小的点,往右可以选几个多的

所以最优情况就应该是选了一个或多个递增的某个区间的中位数

证(猜)毕(完)

每加入一个点形成一个区间,与上一个区间比较,如果上一个区间的中位数大(那么就不满足递增了)就把这个点和上一个区间合并,继续让这个区间和上个区间比较

维护区间中位数可以用左偏树,因为合并后中位数只会减小,所以维护一个大根堆,size>区间大小一半就弹出

rt[]保存了每个区间用的左偏树的根

<变成<=用到了常见技巧 -i

注意:一开始记录区间l和r时写成了l[rt[p]]应该是l[p]

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. #define lc t[x].l
  8. #define rc t[x].r
  9. typedef long long ll;
  10. const int N=1e6+,INF=1e9;
  11. inline int read(){
  12. char c=getchar();int x=,f=;
  13. while(c<''||c>''){if(c=='-')f=-; c=getchar();}
  14. while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
  15. return x*f;
  16. }
  17. int n,a[N];
  18. struct node{
  19. int l,r,v,d,size;
  20. node(){l=r=v=d=size=;}
  21. }t[N];
  22. int sz;
  23. int Merge(int x,int y){
  24. if(x==||y==) return x|y;
  25. if(t[x].v<t[y].v) swap(x,y);
  26. rc=Merge(rc,y);
  27. t[x].size=t[lc].size+t[rc].size+;
  28. if(t[lc].d<t[rc].d) swap(lc,rc);
  29. t[x].d=t[rc].d+;
  30. return x;
  31. }
  32. inline int nw(int v){
  33. t[++sz].v=v;
  34. t[sz].size=;
  35. return sz;
  36. }
  37. inline int top(int x){return t[x].v;}
  38. inline int size(int x){return t[x].size;}
  39. inline void pop(int &x){x=Merge(lc,rc);}
  40. ll ans;
  41. int rt[N],p,l[N],r[N],tot[N];
  42. void solve(){
  43. for(int i=;i<=n;i++){
  44. rt[++p]=nw(a[i]);
  45. l[p]=r[p]=i;tot[p]=;
  46. while(p-&&top(rt[p-])>top(rt[p])){
  47. rt[p-]=Merge(rt[p-],rt[p]);
  48. p--;
  49. r[p]=i;
  50. while(size(rt[p])>(r[p]-l[p]+)/) pop(rt[p]);
  51. }
  52. }
  53. for(int i=;i<=p;i++)
  54. for(int j=l[i];j<=r[i];j++) ans+=abs(a[j]-top(rt[i]));
  55. printf("%lld",ans);
  56. }
  57.  
  58. int main(){
  59. //freopen("in.txt","r",stdin);
  60. n=read();
  61. for(int i=;i<=n;i++) a[i]=read()-i;
  62. t[].d=-;
  63. solve();
  64. return ;
  65. }

BZOJ 1367: [Baltic2004]sequence [可并堆 中位数]的更多相关文章

  1. BZOJ 1367 [Baltic2004]sequence (可并堆)

    题面:BZOJ传送门 题目大意:给你一个序列$a$,让你构造一个递增序列$b$,使得$\sum |a_{i}-b_{i}|$最小,$a_{i},b_{i}$均为整数 神仙题.. 我们先考虑b不递减的情 ...

  2. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

  3. bzoj 1367: [Baltic2004]sequence

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MB Description Input Output 一个整数R Sa ...

  4. 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)

    1367: [Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Ou ...

  5. BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)

    1367: [Baltic2004]sequence Time Limit: 20 Sec   Memory Limit: 64 MB Submit: 521   Solved: 159 [ Subm ...

  6. 【BZOJ-1367】sequence 可并堆+中位数

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 932  Solved: 348[Submit][S ...

  7. 1367: [Baltic2004]sequence

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1090  Solved: 432 [Submit ...

  8. 【BZOJ】1367: [Baltic2004]sequence

    题意 给\(n(n \le 10^6)\)个数的序列\(a\),求一个递增序列\(b\)使得\(\sum_{i=1}^{n} |a_i-b_i|\)最小. 分析 神题啊不会. 具体证明看黄源河论文&l ...

  9. 【bzoj1367】[Baltic2004]sequence 可并堆

    题目描述 输入 输出 一个整数R 样例输入 7 9 4 8 20 14 15 18 样例输出 13 题解 可并堆,黄源河<左偏树的特点及其应用>Page 13例题原题 #include & ...

随机推荐

  1. 构建LVS-DR+Keepalive高可用集群

    ------client----------主LVS----------从LVS------------WEB1-------------WEB2--------- 2.2.2.250  2.2.2. ...

  2. [国嵌攻略][161][USB总线介绍]

    USB发展史 USB(universal serial bus),通用串行总线,是一种外部总线标准.用于规范电脑与外部设备的连接和通讯.USB是在1994年底由英特尔.康柏.IBM.Microsoft ...

  3. <input type="text">和<textarea>的区别

    在我们开发时经常需要用到输入框,通常解决办法就是<input type="text">和<textarea>,那么这两个标签有什么区别呢?  一:<i ...

  4. javascript 之继承-15

    继承 所谓继承就是子类继承父类的特征与行为,使得子类对象具与父类相同的行为.但是javascript 是没有class.抽象类.接口等抽象概念,javascript 只有对象,那么js中是如何让对象与 ...

  5. .23-浅析webpack源码之事件流compilation(1)

    正式开始跑编译,依次解析,首先是: compiler.apply( new JsonpTemplatePlugin(options.output), // start new FunctionModu ...

  6. vue-router自动判断左右翻页转场动画

    前段时间做了一个移动端spa项目,技术基于 :vue + vue-router + vuex + mint-ui 因为使用了vue-cli脚手架的webpack模版,所有页面都以.vue为后缀的文件作 ...

  7. 我是如何将网站全站启用Https的?-记录博客安装配置SSL证书全过程

    评论»   文章目录 为什么要Https 如何选择Https 安装部署SSL证书 平滑过渡Https 搜索引擎的响应 启用Https小结 正如大家所看到的,部落全站已经启用了Https访问了,连续几天 ...

  8. 实现LNMP

    实现LNMP 环境: linux系统机器 A:一台N:nginx,ip:192.168.213.251 B:一台P:php-fpm,php-mysql ,ip:192.168.213.253 C:一台 ...

  9. mybatis_SQL映射(3)

    文章摘录自:http://blog.csdn.net/y172158950/article/details/17304645 1. 表关联 a) 嵌套查询(传说中的1+N问题) <resultM ...

  10. python_如何判断字符串a以某个字符串开头或结尾?

    案例: 某文件系统目录下有一系列文件: 1.c 2.py 3.java 4.sh 5.cpp ...... 编写一个程序,给其中所有的.sh文件和.py文件加上可执行权限 如何解决这个问题? 1. 先 ...