线段树 || BZOJ 1112: [POI2008]砖块Klo
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1112
题解:
希望有连续K柱的高度是一样的,就先把1~K的数扔进线段树(线段树的下标就是数值,不需要离散化),求一波中位数和答案作为初始答案,
再从第K+1到N扫一遍,依次把每个数扔进线段树同时把第i-K个树弄出来扔掉,不断求中位数和更新答案就好了。
这里求序列中所有数到中位数的距离是这样求的:线段树多维护一个sum,当前序列中小于中位数的数的个数记为cnt1,
和为sum1,大于中位数的数的个数记为cnt2,和为sum2。于是答案就很显然是:pt(即中位数)*cnt1-sum1+sum2-pt*cnt2。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int maxn=+,maxh=+,max_h=maxh-;
int N,K,Z;
ll sum[],H[maxn],ans,pt,cnt[];
inline ll rd(){
ll x=;int f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
struct Tree{
int l,r;
ll sum,cnt;
}t[maxh<<];
inline void Build(int x,int l,int r){
t[x].l=l;t[x].r=r;int mid=(l+r)>>;
if(l==r)return;
Build(x<<,l,mid);Build(x<<|,mid+,r);
return;
}
inline void Update(int x,int q,int o){
int l=t[x].l,r=t[x].r,mid=(l+r)>>;
if(l==r&&l==q){
if(o==){t[x].sum+=l; t[x].cnt++;}
else{t[x].sum-=l; t[x].cnt--;}
return;
}
int ls=x<<,rs=x<<|;
if(q<=mid)Update(ls,q,o);else Update(rs,q,o);
t[x].sum=t[ls].sum+t[rs].sum;
t[x].cnt=t[ls].cnt+t[rs].cnt;
return;
}
inline int Find(int x,int z){//寻找中位数
int l=t[x].l,r=t[x].r,ls=x<<,rs=x<<|;
if(l==r)return l;
if(t[ls].cnt>=z)return Find(ls,z);else return Find(rs,z-t[ls].cnt);
}
inline void Work(int x,int ql,int qr,int o){
int l=t[x].l,r=t[x].r,mid=(l+r)>>,ls=x<<,rs=x<<|;
if(ql<=l&&r<=qr){
sum[o]+=t[x].sum;
cnt[o]+=t[x].cnt;
return;
}
if(ql<=mid)Work(ls,ql,qr,o);
if(qr>mid)Work(rs,ql,qr,o);
return;
}
int main(){
N=rd();K=rd();
for(int i=;i<=N;i++){H[i]=rd();H[i]++;}
Build(,,max_h);
for(int i=;i<=K;i++)Update(,H[i],);
Z=(K+)>>;
pt=Find(,Z);//pt即为中位数
sum[]=sum[]=cnt[]=cnt[]=;
Work(,,pt,);Work(,pt,max_h,);
ans=(cnt[]*pt-sum[])+(sum[]-cnt[]*pt);
for(int i=K+;i<=N;i++){
Update(,H[i-K],);Update(,H[i],);
pt=Find(,Z);
sum[]=sum[]=cnt[]=cnt[]=;
Work(,,pt,);Work(,pt,max_h,);
if(ans>(cnt[]*pt-sum[])+(sum[]-cnt[]*pt)){
ans=(cnt[]*pt-sum[])+(sum[]-cnt[]*pt);
}
}
printf("%lld\n",ans);
return ;
}
By:AlenaNuna
线段树 || BZOJ 1112: [POI2008]砖块Klo的更多相关文章
- BZOJ 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
- BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1112 [题目大意] 给出一个数列,对于一个操作,你可以对一个数+1,或者一个数-1, ...
- [BZOJ 1112] [POI2008] 砖块Klo 【区间K大】
题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...
- bzoj 1112: [POI2008]砖块Klo【对顶堆】
priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...
- BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析
Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...
- BZOJ 1112: [POI2008]砖块Klo1112( BST )
枚举每个长度为k的区间, 然后用平衡树找中位数进行判断, 时间复杂度O(nlogn). 早上起来精神状态不太好...连平衡树都不太会写了...果断去看了会儿番然后就A了哈哈哈 ------------ ...
- 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 426[Submit][Statu ...
- 【主席树】bzoj1112: [POI2008]砖块Klo
数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...
- [Bzoj1112][POI2008]砖块Klo(splay)
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2353 Solved: 831[Submit][Statu ...
随机推荐
- funny
var life = { "work_hard","have_fun","make_history" };
- IDEA使用笔记(八)——自动生成 serialVersionUID 的设置
这个设置比较简单,也有一些博文已经写到了,为什么我还要写哪?(潜台词:因为我想凑一篇博文)我觉得学习,特别是编程学习是需要重复造轮子的,另外,就是加深自己的印象方便自己的查找.还有就是关键点,有些博客 ...
- SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)
做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...
- .Net可扩展的单据编号生成器-SNF.CodeRule--SNF快速开发平台3.2
1.背景 在企业应用中单据编号的自定义是一个很常见的需求,如工号.业务单据编码等,能不能抽象一个通用的框架呢? 2.思路 这里的难点在于实现"解释器",比如将"前缀&qu ...
- MySQL保存历史执行语句
MySQL想查看历史执行语句,不能像linux那样通过命令查看 只能将每条执行语句保存到LOG里面,然后通过LOG文件再查找 修改my.cnf配置文件 [mysqld] 字段部分,定义LOG名字为ex ...
- java 路径分隔符自动适配
linux文件路径分隔符为 / ,windows的文件路径分隔符为 \ ,在开发项目过程中不确定用户使用何种操作系统,就需要自动适配路径. 目前已知java提供两种方法获取文件路径分割符: F ...
- Communications link failure due to underlying exception异常处理(转)
最近的一个项目在Hibernate使用C3P0的连接池,数据库为Mysql.开发测试没有问题,在运行中每个一段长的空闲时间就出现异常: java 代码 org.hibernate.exception. ...
- LayaBox IDE 安装后执行项目报错解决方案的一些记录
1.打开IDE后出现“路径xxx未指向有效地tsserver安装.将禁用TypeScript语言功能.”提示: 这是由于杀毒软件吧ts对应的js文件作为病毒删除导致的,一般到杀毒软件的历史界面中将ts ...
- error C3861: “xxxx”: 找不到标识符
问题出现背景:c++静态类库中主函数里包含子函数 解决办法:先声明子函数再写主函数.
- 为app录制展示gif
已同步更新至个人blog:http://dxjia.cn/2015/07/make-gif-for-app/ 在github上好多不错的开源项目展示demo的时候,都是采用了一个gif图片,很生动具体 ...