BZOJ_1367_[Baltic2004]sequence_结论题+可并堆

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


神题。有一个结论:最优解一定是把序列分成m块,每块取中位数,并使得取出的序列递增。

不会证?https://wenku.baidu.com/view/20e9ff18964bcf84b9d57ba1.html

然后发现后面的合法中位数递增,搞来一个可并大根堆来维护,当堆内元素超过序列的一半时弹出。

然而结论要求序列不降,这里求序列递增。

我们发现每个递增的序列的每个数$ai$ 减去$i$ 对应着唯一一个不降序列,故在一开始对序列进行处理。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char nc() {
static char buf[100000],*p1,*p2;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd() {
register int x=0; register char s=nc();
while(s<'0'||s>'9') s=nc();
while(s>='0'&&s<='9') x=x*10+s-'0',s=nc();
return x;
}
int fabs(int x){return x>0?x:-x;}
#define N 1000050
typedef long long ll;
int n,a[N],root[N],siz[N],val[N],ls[N],rs[N],dis[N],lp[N],rp[N];
ll ans;
int merge(int x,int y) {
if(!x) return y;
if(!y) return x;
if(val[x]<val[y]) swap(x,y);
siz[x]+=siz[y];
rs[x]=merge(rs[x],y);
if(dis[rs[x]]>dis[ls[x]]) swap(ls[x],rs[x]);
dis[x]=dis[rs[x]]+1;
return x;
}
int main() {
n=rd();
int i,tot=0,m=0,j;
for(i=1;i<=n;i++) a[i]=rd(),a[i]-=i;
dis[0]=-1;
for(i=1;i<=n;i++) {
root[++m]=++tot; val[tot]=a[i]; siz[tot]=1; lp[m]=rp[m]=i;
while(m>1&&val[root[m]]<val[root[m-1]]) {
m--; root[m]=merge(root[m],root[m+1]); rp[m]=rp[m+1];
while(2*siz[root[m]]>rp[m]-lp[m]+2) root[m]=merge(ls[root[m]],rs[root[m]]);
}
}
for(i=1;i<=m;i++) {
for(j=lp[i];j<=rp[i];j++) {
ans+=fabs(val[root[i]]-a[j]);
}
}
printf("%lld\n",ans);
}

BZOJ_1367_[Baltic2004]sequence_结论题+可并堆的更多相关文章

  1. [BZOJ3609][Heoi2014]人人尽说江南好 结论题

    Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏.     在过去,人们是要 ...

  2. [codevs5578][咸鱼]tarjan/结论题

    5578 咸鱼  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都 ...

  3. 【uoj#282】长度测量鸡 结论题

    题目描述 给出一个长度为 $\frac{n(n+1)}2$ 的直尺,要在 $0$ 和 $\frac{n(n+1)}2$ 之间选择 $n-1$ 个刻度,使得 $1\sim \frac{n(n+1)}2$ ...

  4. 【uoj#175】新年的网警 结论题+Hash

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向连通图,每条边的边权为1.对于每个点 $i$ ,问是否存在另一个点 $j$ ,使得对于任意一个不为 $i$ 或 $j$ 的点 $k$ ,$i$ 到 ...

  5. 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组

    题目描述 给出两个长度为 $n$ 的排列 $A$ 和 $B$ ,如果 $A_i>A_{i+1}$ 则可以交换 $A_i$ 和 $A_{i+1}$ .问是否能将 $A$ 交换成 $B$ . 输入 ...

  6. 【bzoj4401】块的计数 结论题

    题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...

  7. 【bzoj3997】[TJOI2015]组合数学 Dilworth定理结论题+dp

    题目描述 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...

  8. 【bzoj2079】[Poi2010]Guilds 构造结论题

    题目描述 Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处.这里有n个城市,其中有一些以双向马路相连,这两个工会要求每个城市 ...

  9. agc015F - Kenus the Ancient Greek(结论题)

    题意 题目链接 $Q$组询问,每次给出$[x, y]$,定义$f(x, y)$为计算$(x, y)$的最大公约数需要的步数,设$i \leqslant x, j \leqslant y$,求$max( ...

随机推荐

  1. Spring2.5整合Ibatis入门级开发实例

      分类: SPRING IBATIS2010-11-22 20:19 1170人阅读 评论(0) 收藏 举报 ibatisspringstringpropertiesclassuser 最近一直在看 ...

  2. JavaScript异步编程:Generator与Async

    从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱. Promise是下边要讲的Generator/yield与async/await的基 ...

  3. /usr/lib/uwsgi/plugins/python_plugin.so: cannot open shared object file: No such file or directory

    Django uwsgi部署方式下产生这个Bug,后来发现把uwsgi配置ini文件里面的 #plugins = python 把上面这句配置语句注释掉,uwsgi就可以运行了,当然,是正常可用运行状 ...

  4. 二分查找算法的C++和PHP实现

    C++实现方式: #include<iostream> #include<stdlib.h>#include<algorithm> using namespace ...

  5. Fiddler抓包使用教程-Android应用抓包

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/74439165 本文出自[赵彦军的博客] Fiddler 也可以支持对手机应用进行 ...

  6. python pandas import 失败

    今天因为数据处理的需要,安装了pandas. 我的python版本是2.7,使用的编辑器是pycharm.我现在cmd中输入了pip install pandas,然后显示安装成功,但是在使用pand ...

  7. 使用TortoiseGit操作分支的创建与合并

    第一步:创建本地分支 点击右键选择TortoiseGit,选择Create Branch…,在Branch框中填写新分支的名称(若选中”switch to new branch”则直接转到新分支上,省 ...

  8. 获取linux帮助命令

    命令的分类 linux的命令分为内部命令和外部命令.  内部命令指的是shell程序自带的命令,是shell程序的一部分,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系 ...

  9. 字符串转json以及获取域名的参数

    本例将通过location.search来进行字符串拼接成json以及查询域名参数的value console.log(request('id')); function request(obj){ v ...

  10. ubuntu宽带连接

    1.打开终端:    输入:sudo pppoeconf    根据提示输入宽带用户名和密码,若提示Plugin rp-pppoe.so loaded.则已连接成功.2.手动开启/断开连接:    p ...