题目: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的更多相关文章

  1. BZOJ 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1736  Solved: 606[Submit][Statu ...

  2. BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1112 [题目大意] 给出一个数列,对于一个操作,你可以对一个数+1,或者一个数-1, ...

  3. [BZOJ 1112] [POI2008] 砖块Klo 【区间K大】

    题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...

  4. bzoj 1112: [POI2008]砖块Klo【对顶堆】

    priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...

  5. BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析

    Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...

  6. BZOJ 1112: [POI2008]砖块Klo1112( BST )

    枚举每个长度为k的区间, 然后用平衡树找中位数进行判断, 时间复杂度O(nlogn). 早上起来精神状态不太好...连平衡树都不太会写了...果断去看了会儿番然后就A了哈哈哈 ------------ ...

  7. 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 426[Submit][Statu ...

  8. 【主席树】bzoj1112: [POI2008]砖块Klo

    数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...

  9. [Bzoj1112][POI2008]砖块Klo(splay)

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2353  Solved: 831[Submit][Statu ...

随机推荐

  1. SoapUI Pro Project Solution Collection-Custom project and setup

    import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import com.eviware.soap ...

  2. Volley 框架解析(二)--RequestQueue核心解读

    主要围绕RequestQueue进行解读,它的两个请求队列CacheQueue.NetworkQueue是如何调用的,第一条请求的执行过程及如何处理重复请求?对RequestQueue及相关的类进行详 ...

  3. C#-MVC开发微信应用(4)--微信门户菜单的管理操作

    最近对微信接口进行深入的研究,通过把底层接口一步步进行封装后,逐步升级到自动化配置.自动化应答,以及后台处理界面的优化和完善上,力求搭建一个较为完善.适用的微信门户应用管理系统. 在微信门户系统里面, ...

  4. appium 获取android 粘贴板上的内容

    appium 新版本增加了获取粘贴板的内容.如果使用appium旧版本,获取粘贴板的内容不是那么容易的,甚至百度谷歌各种搜,都无法找到合适的解决方法.新版本获取android 粘贴板内容就显得很容易了 ...

  5. [ci]jenkins构建容器项目java-helloworld-非docker plugin模式

    栗子思路说明: 不使用任何docker plugin 使用jenkins server本地(含mvn环境)构建,无jenkins slave jenkins server本地构建的war包,推送dep ...

  6. python3.6 使用pyinstaller 打包web程序的方法

    官方文档连接 (https://pyinstaller.readthedocs.io/en/stable/ ) 第一步,下载pywin32 首先下载pywin32,下面是下载链接,下载自己的系统版本对 ...

  7. 实现A星算法

    [更新] 稍微将A*算法进行修正,使用BFS(按F值对open表排序),另外,新增评估函数,用来测量当前点到终点的线段上的随机某一点是否是墙或已访问结点,是的话返回1,否则返回0. function ...

  8. 使用自定义的 Manager

    class CategoryManager(models.Manager): """ A manager that adds an "active()" ...

  9. 【九天教您南方cass 9.1】 05 打印出图

    同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取测量空间中. [点击索取cass教程]5元立得 (给客服说暗号:“ ...

  10. Docker镜像中的base镜像理解

    base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建. 其他镜像可以之为基础进行扩展. 所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ub ...