BZOJ 1367: [Baltic2004]sequence [可并堆 中位数]
1367: [Baltic2004]sequence
Time Limit: 20 Sec Memory Limit: 64 MB
Submit: 1111 Solved: 439
[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
这里是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 ;
}
BZOJ 1367: [Baltic2004]sequence [可并堆 中位数]的更多相关文章
- BZOJ 1367 [Baltic2004]sequence (可并堆)
题面:BZOJ传送门 题目大意:给你一个序列$a$,让你构造一个递增序列$b$,使得$\sum |a_{i}-b_{i}|$最小,$a_{i},b_{i}$均为整数 神仙题.. 我们先考虑b不递减的情 ...
- BZOJ 1367 [Baltic2004]sequence 解题报告
BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...
- bzoj 1367: [Baltic2004]sequence
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Description Input Output 一个整数R Sa ...
- 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)
1367: [Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Ou ...
- BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Submit: 521 Solved: 159 [ Subm ...
- 【BZOJ-1367】sequence 可并堆+中位数
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 932 Solved: 348[Submit][S ...
- 1367: [Baltic2004]sequence
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1090 Solved: 432 [Submit ...
- 【BZOJ】1367: [Baltic2004]sequence
题意 给\(n(n \le 10^6)\)个数的序列\(a\),求一个递增序列\(b\)使得\(\sum_{i=1}^{n} |a_i-b_i|\)最小. 分析 神题啊不会. 具体证明看黄源河论文&l ...
- 【bzoj1367】[Baltic2004]sequence 可并堆
题目描述 输入 输出 一个整数R 样例输入 7 9 4 8 20 14 15 18 样例输出 13 题解 可并堆,黄源河<左偏树的特点及其应用>Page 13例题原题 #include & ...
随机推荐
- Linux中git的使用
之前在windows中一直采用github的桌面版,库的建立更新都是借助软件的帮助.所使用的的功能也非常局限,仅仅只是创建库再提交自己的代码.至于版本管理.回滚.分支以及git的结构都没有清楚的认识. ...
- Vs自定义设置
1.固定选项卡独立行显示设置 效果如下 2.语言设置 可以从官网寻找所需版本语言包 https://my.visualstudio.com/downloads 3.代码段设置 可以对现有的进行一些改造 ...
- ES6中promise的使用方法
先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...
- 久未更 ~ 四之 —— Vsftpd出现 Failed to start Vsftpd ftp daemon错误
> > > > > 久未更 系列一:Failed to start Vsftpd ftp daemon错误 配置 vsftpd.conf文件后 重启ftp服务 出现 Fa ...
- C#面试常见题目
1.CTS.CLS.CLR分别作何解释 CTS:Common Type System 通用系统类型.Int32.Int16→int.String→string.Boolean→bool CLS:Com ...
- 最近公司用到了lombok,感觉很不错的样子,所以上网搜了一些资料,总结了一下用法。
lombok作用:它提供了简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码,特别是相对于 POJO.缺点是使用lombok虽然能够省去手动创建setter和getter方法的麻烦, ...
- telnet配置和telnet用法
搭建或配置网络环境时,经常会使用ping命令检查网络是否可达.有些时候Ping命令也不好使,比如因防火墙禁止或访问策略限制等.则可使用telnet测试映射端口或远程访问主机. Telnet协议是TCP ...
- maven配置文件详解
settings.xml 本篇文章主要对maven中setting.xml配置文件进行解释 1.声明规范 <settings xmlns="http://maven.apache.or ...
- Hystrix-request cache(请求缓存)
开启请求缓存 请求缓存在run()和construce()执行之前生效,所以可以有效减少不必要的线程开销.你可以通过实现getCachekey()方法来开启请求缓存. package org.hope ...
- Maven以及在Maven在Myeclipse中的配置
一.maven安装与配置1.到官网http://maven.apache.org/download.cgi下载maven压缩包,解压到指定文件夹.如:D:\apache-maven-3.3.92.添加 ...