线段树 || 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 ...
随机推荐
- vue中Axios请求豆瓣API数据并展示到Swipe中
vue中Axios请求豆瓣API数据并展示到Swipe中 1.首先是安装Axios: 安装方法cnpm install axios --save 等待npm安装完毕: 2.在main.js中引入axi ...
- Java 迭代器综述
一.摘要 迭代器模式是与集合共生共死的.一般来说.我们仅仅要实现一个容器,就须要同一时候提供这个容器的迭代器.使用迭代器的优点是:封装容器的内部实现细节,对于不同的集合,能够提供统一的遍历方式,简化c ...
- 【java】解析java网络
目录结构: contents structure [+] 模拟Post与Get请求 设置Authorization头信息 基于TCP的网络编程 TCP协议简介 半关闭的Socket TCP长链接 TC ...
- NodeJs相关系列文章
1.图片上传之FileAPI与NodeJs 2.NodeJs之调试 3.CentOS下使用NVM 4.NodeJs之进程守护 5.Ubuntu下使用nvm 6.NodeJs之pm2 7.NodeJs之 ...
- 如何在TextView类中创建超链接 Linkify
Linkify是一个辅助类,通过RegEx样式匹配,自动地在TextView类(和继承的类)中创建超链接.符合特定的RegEx样式的文本会被转变成可点击的超链接,这些超链接隐式的调用startActi ...
- Android Studio原生库创建示例
[时间:2017-07] [状态:Open] [关键词:Android,Android Studio,gradle,native,c,c++,cmake,原生开发] 0 引言 最近在工作中遇到了升级A ...
- [转]devm_gpiod_get_optional用法
https://blog.csdn.net/kris_fei/article/details/78932904
- 【原】为DevExpress的ChartControl添加Y轴控制 和 GridControl中指定列添加超级链接
一.控制ChartControl的Y轴范围 使用Devexpress中的CharControl控件,需要控制AxisY轴的显示范围,需要使用该控件的BoundDataChanged事件,具体代码如下: ...
- vue.js是什么
Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习, ...
- 【转】燃烧吧,TestMice!
...当我们几个人碰面的时候,就感觉应该做点测试业内的实事. 记得当时的17站出了一些QTP辅件,给了我一些灵感.2008年做了一整年的QTP企业级实施,从方案到最后的收尾支持,得到最大的教训就是,当 ...