BZOJ 1367 [Baltic2004]sequence
左偏树
左偏树论文题。左偏树的优越性在于它可以不断找出树高最短的一段,因此能一直保持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相关推荐
- BZOJ 1367 [Baltic2004]sequence 可并堆
题意:链接 方法:可并堆 解析: wzc讲的第二道可并堆?不这是第一道,然后之前他好像还讲了个双堆求中位数? 大概想想,是不是就是维护一个小根堆以及一个大根堆,之后每次来元素,比中位数大就加到小根堆, ...
- BZOJ 3043 IncDec Sequence:反向差分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3043 题意: 给定一个长度为n的数列a[i],每次可以选择一个区间[l,r],使这个区间内 ...
- 可并堆试水--BZOJ1367: [Baltic2004]sequence
n<=1e6个数,把他们修改成递增序列需把每个数增加或减少的总量最小是多少? 方法一:可以证明最后修改的每个数一定是原序列中的数!于是$n^2$DP(逃) 方法二:把$A_i$改成$A_i-i$ ...
- 【BZOJ-1367】sequence 可并堆+中位数
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Submit: 932 Solved: 348 [Submit] ...
- 【学习笔记】浅谈短小可爱的左偏树(可并堆)
文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...
- [颓废史]蒟蒻的刷题记录
QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...
- bzoj 2656: [Zjoi2012]数列(sequence)(简单高精度模板2.0)
2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec Memory Limit: 128 MB Submit: 1663 Solved: 860 [Subm ...
- 【BZOJ】4355: Play with sequence
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=4355 吉司机线段树(去年又在现场系列) 某Q:线段树带来的沉重打击 写得巨挫,下次肯定会去换 ...
- BZOJ 4355: Play with sequence
调了好久,还是黑盒测试有前途 我以前怕不是学了假的吉利线段树(我第一次知道还要记次小值去更新的........) #include<cstdio> #include<algorith ...
最新文章
- 4G EPS 中的 User Plane
- 翻译-Salt与Ansible全方位比较
- mysql:视图,触发器,事务,存储过程,函数
- CPU资源和可用内存大小
- struts上传文件,验证失败表单数据丢失的原因
- django和mysql如何建模_Django如何设计数据模型
- python调用java文件_Python程序中调用Java代码的实践
- 阿里布局物联网!开源操作系统 AliOS Things 喜提 1 亿芯片出货量
- 【毕业答辩】别小看毕业答辩PPT,它和你的论文一样重要
- oracle 表列统计信息,Oracle中收集表与列统计信息
- 区块链:深入浅出零知识证明
- 基于Packet Tracer 的校园网络设计方案(计算机网络与通信技术课程实验)(二)——IP网络仿真配置
- 电磁学matlab仿真实验报告,利用MATLAB语言处理电磁学实验.doc
- matlab将图片转化视频文件格式,MATLAB与图像处理(四):将图片序列转化为视频文件,将视频文件转化为图片...
- 网上在线字典辞典大全
- win10需要修复计算机,超好用!Win10自带修复系统 隐藏太深
- linux在防火墙上打开1521端口
- (转)当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica
- 高并发高流量网站架构详解
- 【SIGIR22】使用反事实生成器来消除知识感知推荐中的虚假联系