BZOJ[1367][Baltic2004]Sequence 可并堆
来源:互联网 发布:android 7.0源码 编辑:程序博客网 时间:2024/06/16 10:57
题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=1367
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
先考虑两种特殊情况:
①若
则对于每一个
②若
则对于每一个
下面是我瞎证明的过程:
对于情况②,我们对每一个
如改变所取的值(如图,取较大于中位数的数),则会发现前面的数减少了棕色部分,后面的数减小了紫色部分,发现这两部分事实上是相等的,前后的总和并没有改变,但R值却多了中间的那一部分(画圈部分),得证,偶数情况与其类似,在此不做赘述
我们可以将原序列分割成许多单调递减的序列,这些序列所有数都取他们的中位数
但是我们要求的是上升序列而不是不下降序列,所以需要将输入的
首先我们把
代码如下:
#include<algorithm>#include<cstdlib>#include<cstdio>#define N 1000600using namespace std;int size[N],ch[N][2],a[N],root[N],l[N],r[N],tot[N],top,n;long long ans=0ll;int merge(int x,int y){ if(!x) return y;if(!y) return x; if(a[x]<a[y]) swap(x,y); ch[x][1]=merge(ch[x][1],y); size[x]=size[ch[x][1]]+size[ch[x][0]]+1; swap(ch[x][0],ch[x][1]);return x;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i),a[i]-=i;//要求单调递增 for(int i=1;i<=n;i++){//root:这段区间的中位数 l[++top]=r[top]=root[top]=i;//l:这段区间包含的最左边的点,r:这段区间包含的最右边的点 tot[top]=size[i]=1;//tot:这个区间包含多少个数 size: while(top>1&&a[root[top-1]]>a[root[top]]){ r[--top]=r[top+1]; tot[top]+=tot[top+1]; root[top]=merge(root[top],root[top+1]);//将这个点合并到上一个序列里 //下面的过程是将中位数调到堆顶(不断删除堆顶) while(size[root[top]]*2>tot[top]+1) root[top]=merge(ch[root[top]][0],ch[root[top]][1]); } } for(int i=1;i<=top;i++) for(int j=l[i];j<=r[i];j++) ans+=(long long)abs(a[j]-a[root[i]]);return printf("%lld",ans),0;}
附:不同可并堆的效率比较:
从上到下:斜堆,左偏树,随机堆(19260817)
左偏树还是稳定啊(笑)
- BZOJ 1367 [Baltic2004]sequence 可并堆
- 【BZOJ 1367】 [Baltic2004]sequence 可并堆
- BZOJ[1367][Baltic2004]Sequence 可并堆
- [可并堆 中位数] BZOJ 1367 [Baltic2004]sequence
- bzoj 1367: [Baltic2004]sequence(中位数+可并堆)
- BZOJ 1367 [Baltic2004]sequence【脑洞+可并堆
- bzoj1367 [Baltic2004]sequence(可并堆+中位数)
- 【BZOJ 1367】 [Baltic2004]sequence
- BZOJ 1367: [Baltic2004]sequence
- [BZOJ 1367][Baltic2004]sequence
- BZOJ 1367 [Baltic2004]sequence
- bzoj 1367: [Baltic2004]sequence
- BZOJ 1367: [Baltic2004]sequence 左偏树
- [ 可并堆 贪心 ] [ Baltic2004 ] BZOJ1367
- BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)
- BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)
- BZOJ 1367 [Baltic2004]sequence 解题报告
- bzoj 1367: [Baltic2004]sequence 左偏树+贪心
- Express hello world
- Android视频播放 的几种方式
- Unity1--生命周期函数和颜色配置
- HDU 6152-Friend-Graph(ccpc)
- 启用lumen的user token认证
- BZOJ[1367][Baltic2004]Sequence 可并堆
- Evaluate the value of an arithmetic expression in Reverse Polish Notation.
- 算法入门经典——果园里的树
- 23.odoo入门——工作杂记
- [12] LNMP架构
- A*算法浅析
- 并查集-总结
- [python]1.Django的基本用法
- HDU 6153-A Secret(kmp&&ccpc)