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]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define lc t[x].l
#define rc t[x].r
typedef long long ll;
const int N=1e6+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,a[N];
struct node{
int l,r,v,d,size;
node(){l=r=v=d=size=;}
}t[N];
int sz;
int Merge(int x,int y){
if(x==||y==) return x|y;
if(t[x].v<t[y].v) swap(x,y);
rc=Merge(rc,y);
t[x].size=t[lc].size+t[rc].size+;
if(t[lc].d<t[rc].d) swap(lc,rc);
t[x].d=t[rc].d+;
return x;
}
inline int nw(int v){
t[++sz].v=v;
t[sz].size=;
return sz;
}
inline int top(int x){return t[x].v;}
inline int size(int x){return t[x].size;}
inline void pop(int &x){x=Merge(lc,rc);}
ll ans;
int rt[N],p,l[N],r[N],tot[N];
void solve(){
for(int i=;i<=n;i++){
rt[++p]=nw(a[i]);
l[p]=r[p]=i;tot[p]=;
while(p-&&top(rt[p-])>top(rt[p])){
rt[p-]=Merge(rt[p-],rt[p]);
p--;
r[p]=i;
while(size(rt[p])>(r[p]-l[p]+)/) pop(rt[p]);
}
}
for(int i=;i<=p;i++)
for(int j=l[i];j<=r[i];j++) ans+=abs(a[j]-top(rt[i]));
printf("%lld",ans);
} int main(){
//freopen("in.txt","r",stdin);
n=read();
for(int i=;i<=n;i++) a[i]=read()-i;
t[].d=-;
solve();
return ;
}

最新文章

  1. C#语法糖,让编程更具乐趣
  2. export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
  3. css3新特性@rgba
  4. CodeBlocks VS2015编译环境设置
  5. Microsoft Office下载地址
  6. Unix 入门
  7. MSP430F149学习之路——蓝牙模块
  8. windows 创建SSH Key
  9. Spring实战——无需一行xml配置实现自动化注入
  10. [HeadFirst-HTMLCSS入门][第十一章布局排版]
  11. Windows7上FTP服务器建立
  12. Android源代码同步脚本(增加设置线程参数)
  13. js中的事件委托详解
  14. 使用commons.cli实现MyCP
  15. CentOS 7的安装详解
  16. 学用纯CSS打造可折叠树状菜单
  17. canvas(五)createPattern
  18. ajax 调用 java webapi 多个参数(二)
  19. trie字典树
  20. KMP字符串匹配算法理解(转)

热门文章

  1. C#面试题整理(1)
  2. [国嵌笔记][021-022][ARM处理器工作模式]
  3. Java入门篇(六)——类和对象
  4. HTML meta refresh 刷新与跳转(重定向)页面
  5. MySQL字符集设置—MySQL数据库乱码问题
  6. [知了堂学习笔记]_记一次BootStrap的使用
  7. -------- ROOTKIT 核心技术——系统服务调度表挂钩调试(PART III) --------
  8. linux 如何降低入向软中断占比
  9. 记录linux tty的一次软锁排查2
  10. .net 和 core2.0 数据库连接字符串