左偏树

左偏树论文题。左偏树的优越性在于它可以不断找出树高最短的一段,因此能一直保持O(logn)的合并复杂度。

对于这题,先转成不降序列来做,只需-i

我们将序列先分成n段,则每一段的最优解z[i]=t[i],从左到右一段一段做,考虑合并。

若z[i] <= t[i],不需要合并。去做下一段。

若z[i] > t[i],易证(感性地想,或者去看论文)两段的最优解应当是两段所有数字的中位数。于是合并两段并改最优解为中位数。去做下一段。

维护中位数的过程需要左偏树。

#include<cstdio>
#include<algorithm>
#define N 1000005
using namespace std;
namespace ziqian
{int a[N], hcnt, cnt[N], num[N], l[N], r[N], tot, root[N];struct heap{int l, r, v, dis;}h[N];int new_heap(int v){h[++hcnt] = (heap){0,0,v,0};return hcnt;}int merge(int x, int y)// big root{if(!x || !y)return x?x:y;if(h[x].v < h[y].v)swap(x, y);h[x].r = merge(h[x].r,y);if(h[h[x].l].dis < h[h[x].r].dis)swap(h[x].l, h[x].r);h[x].dis = h[h[x].l].dis + 1;return x;}int pop(int x){return merge(h[x].l,h[x].r);}int abs(int x){return x>0?x:-x;}void main(){int n;scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&a[i]);a[i]-=i;}for(int i = 1; i <= n; i++){++tot;root[tot] = new_heap(a[i]);l[tot] = r[tot] = i;cnt[tot] = num[tot] = 1;while(tot > 1 && h[root[tot-1]].v > h[root[tot]].v){--tot;root[tot] = merge(root[tot], root[tot+1]);cnt[tot] += cnt[tot+1];num[tot] += num[tot+1];r[tot] = r[tot+1];while(num[tot] > (cnt[tot]+1)/2){ root[tot] = pop(root[tot]);num[tot]--; } }}long long ans = 0;for(int i = 1; i <= tot; i++){int tmp = h[root[i]].v;for(int j = l[i]; j <= r[i]; j++)ans += abs(a[j] - tmp);}printf("%lld\n",ans);}
}
int main()
{ziqian::main();
}

BZOJ 1367 [Baltic2004]sequence相关推荐

  1. BZOJ 1367 [Baltic2004]sequence 可并堆

    题意:链接 方法:可并堆 解析: wzc讲的第二道可并堆?不这是第一道,然后之前他好像还讲了个双堆求中位数? 大概想想,是不是就是维护一个小根堆以及一个大根堆,之后每次来元素,比中位数大就加到小根堆, ...

  2. BZOJ 3043 IncDec Sequence:反向差分

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3043 题意: 给定一个长度为n的数列a[i],每次可以选择一个区间[l,r],使这个区间内 ...

  3. 可并堆试水--BZOJ1367: [Baltic2004]sequence

    n<=1e6个数,把他们修改成递增序列需把每个数增加或减少的总量最小是多少? 方法一:可以证明最后修改的每个数一定是原序列中的数!于是$n^2$DP(逃) 方法二:把$A_i$改成$A_i-i$ ...

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

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

  5. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  6. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  7. bzoj 2656: [Zjoi2012]数列(sequence)(简单高精度模板2.0)

    2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 1663  Solved: 860 [Subm ...

  8. 【BZOJ】4355: Play with sequence

    传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=4355 吉司机线段树(去年又在现场系列) 某Q:线段树带来的沉重打击 写得巨挫,下次肯定会去换 ...

  9. BZOJ 4355: Play with sequence

    调了好久,还是黑盒测试有前途 我以前怕不是学了假的吉利线段树(我第一次知道还要记次小值去更新的........) #include<cstdio> #include<algorith ...

最新文章

  1. 4G EPS 中的 User Plane
  2. 翻译-Salt与Ansible全方位比较
  3. mysql:视图,触发器,事务,存储过程,函数
  4. CPU资源和可用内存大小
  5. struts上传文件,验证失败表单数据丢失的原因
  6. django和mysql如何建模_Django如何设计数据模型
  7. python调用java文件_Python程序中调用Java代码的实践
  8. 阿里布局物联网!开源操作系统 AliOS Things 喜提 1 亿芯片出货量
  9. 【毕业答辩】别小看毕业答辩PPT,它和你的论文一样重要
  10. oracle 表列统计信息,Oracle中收集表与列统计信息
  11. 区块链:深入浅出零知识证明
  12. 基于Packet Tracer 的校园网络设计方案(计算机网络与通信技术课程实验)(二)——IP网络仿真配置
  13. 电磁学matlab仿真实验报告,利用MATLAB语言处理电磁学实验.doc
  14. matlab将图片转化视频文件格式,MATLAB与图像处理(四):将图片序列转化为视频文件,将视频文件转化为图片...
  15. 网上在线字典辞典大全
  16. win10需要修复计算机,超好用!Win10自带修复系统 隐藏太深
  17. linux在防火墙上打开1521端口
  18. (转)当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica
  19. 高并发高流量网站架构详解
  20. 【SIGIR22】使用反事实生成器来消除知识感知推荐中的虚假联系

热门文章

  1. 查看安卓系统的外接USB声卡
  2. 一个大学毕业生的反思
  3. 2022保密教育线上培训考试参考答案 01
  4. linux中查看文件大小
  5. Ptr ds 与ptr ss
  6. 毕业论文格式要求 题注修改
  7. 最受欢迎的八种编程语言
  8. RN:React Native原理以及新架构JSI、Fabric等概念
  9. YOLOX升级 | 阿里巴巴提出YOLOX-PAI,1ms内精度无敌!
  10. 如何制作wordpress短代码