【bzoj1367】[Baltic2004]sequence
2016-05-31 17:31:26
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1367
题解:http://www.cnblogs.com/rausen/p/4033724.html
说一下堆里维护的是什么。
维护的是所代表区间的中位数,这是一棵大根堆,只有序列递减时我们才会合并堆,也就是加入的数是小的,所以只会将中位数变小,弹出堆顶更新。
题目要求的是单增的序列,但我们这样求出的是不减。
一个小技巧,就是每个数在读入时减去i,这样就保证了修改后的序列不减的情况下,是原序列的单增。
而这种改变是极小的,即不会改变答案大小。
#include<bits/stdc++.h>
#define inf 1000000000
#define ll long long
#define N 1000005
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,tot,rt[N],v[N],dep[N],ls[N],rs[N],l[N],r[N],cnt[N],num[N];
int merge(int x,int y){
if(!x||!y)return x+y;
if(v[x]<v[y])swap(x,y);
rs[x]=merge(rs[x],y);
if(dep[ls[x]]<dep[rs[x]])swap(ls[x],rs[x]);
dep[x]=dep[rs[x]]+;
return x;
}
int main(){
n=read();
for(int i=;i<=n;i++)v[i]=read()-i;
for(int i=;i<=n;i++){
++tot;
rt[tot]=i;cnt[tot]=;num[tot]=;
l[tot]=r[tot]=i;
while(tot>&&v[rt[tot]]<v[rt[tot-]]){
--tot;
rt[tot]=merge(rt[tot],rt[tot+]);
num[tot]+=num[tot+];cnt[tot]+=cnt[tot+];r[tot]=r[tot+];
for(;cnt[tot]*>num[tot]+;cnt[tot]--)rt[tot]=merge(ls[rt[tot]],rs[rt[tot]]);
}
}
ll ans=;
for(int i=;i<=tot;i++)
for(int j=l[i],w=v[rt[i]];j<=r[i];j++)
ans+=abs(v[j]-w);
printf("%lld\n",ans);
return ;
}
1367: [Baltic2004]sequence
Time Limit: 20 Sec Memory Limit: 64 MB
Submit: 953 Solved: 362
[Submit][Status][Discuss]
Description

Input

Output
Sample Input
9
4
8
20
14
15
18
Sample Output
HINT
所求的Z序列为6,7,8,13,14,15,18.
R=13
【bzoj1367】[Baltic2004]sequence的更多相关文章
- 【BZOJ1367】[Baltic2004]sequence 左偏树
[BZOJ1367][Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sampl ...
- 【bzoj1367】[Baltic2004]sequence 可并堆
题目描述 输入 输出 一个整数R 样例输入 7 9 4 8 20 14 15 18 样例输出 13 题解 可并堆,黄源河<左偏树的特点及其应用>Page 13例题原题 #include & ...
- 【arc071f】Infinite Sequence(动态规划)
[arc071f]Infinite Sequence(动态规划) 题面 atcoder 洛谷 题解 不难发现如果两个不为\(1\)的数连在一起,那么后面所有数都必须相等. 设\(f[i]\)表示\([ ...
- 【arc074e】RGB Sequence(动态规划)
[arc074e]RGB Sequence(动态规划) 题面 atcoder 洛谷 翻译见洛谷 题解 直接考虑暴力\(dp\),设\(f[i][j][k][l]\)表示当前考虑到第\(i\)位,最后一 ...
- 【BZOJ3043】IncDec Sequence 乱搞
[BZOJ3043]IncDec Sequence Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一.问至少需要 ...
- 【BZOJ-1367】sequence 可并堆+中位数
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 932 Solved: 348[Submit][S ...
- 【BZOJ1367】【Baltic2004】sequence - 可合并堆
题意: 题解: 其实这是道水题啦……只不过我没做过而已 先考虑构造不严格递增序列,考虑原序列中的一段下降区间,显然区间中的$z$全取中位数最优: 那么可以把原序列拆成很多个下降序列,从头到尾加入原序列 ...
- 【XSY2985】【BZOJ1367】【Baltic2004】sequence
考虑两种情况: 1.\(a_1\)<\(a_2\)<\(a_3\)<\(a_4\)...<\(a_n\) 直接令\(b_i\)=\(a_i\),最小. 2.\(a_1\)> ...
- 【POJ2778】DNA Sequence(AC自动机,DP)
题意: 生物课上我们学到,DNA序列中只有A, C, T和G四种片段. 经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段"ATC"是不好片段,则"AGATC ...
随机推荐
- Delphi中的变量作用域简介
1.在函数或过程中声明的变量是局部变量,只能在函数或过程中使用 2.在单元的implementation部分声明的变量是单元级的(又称模块级.窗体级)变量,该单元的所有函数与过程都能使用,其他引用该单 ...
- 堆栈C实现
标准C语言没有像C++那样可以直接调用的STL容器,所以在c语言中实现容器功能就得自己去定义堆栈结构: stack.h /************this head file defines a st ...
- bee使用
beego虽然是一个简单的框架,但是其中用到了很多第三方的包,所以在你安装beego的过程中Go会自动安装其他关联的包. 当然第一步你需要安装Go,如何安装Go请参考我的书 安装beego go ge ...
- android 入门- 词汇
final Resources.Theme theme = context.getTheme(); TypedArray a = theme.obtainStyledAttributes();获得自定 ...
- 注解:【有连接表的】Hibernate单向N->1关联
Person与Address关联:单向N->1,[有连接表的] Person.java package org.crazyit.app.domain; import javax.persiste ...
- Cygwin的安装与配置
去cygwin的官网去下载: 安装: 初次安装 卸载 使用过程中安装新的工具包 参考http://blog.csdn.net/superbinbin1/article/details/10147421 ...
- 手机端touchstart,touchmove,touchend事件,优化用户划入某个可以点击LI的效果
在我们滑动手机的时候,如果LI或者DIV标签可以点击,那么在移动端给用户一个效果 /*id为添加效果LI上的UL的ID,或者是当前DIV的ID*/ function doTouchPublic(id) ...
- ThinkPHP3.2 volist嵌套循环显示原理
php页面:$fatherList = $Document->where('pid=1')->select(); foreach($fatherList as $n=> ...
- SU Demos-05Sorting Traces-02Demos
运行结果: 不足之处,欢迎批评指正.
- node EventEmitter 注册事件
var EventEmitter = require("events").EventEmitter var event = new EventEmitter() event.on( ...