线段树 || 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 ...
随机推荐
- C#中Invoke的用法2
在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往 ...
- Swift搭建本地http服务器,实现外部视频即时播放
最近项目有个小需求,需要ios实现手机作为服务端,将内部视频文件,在外面能够直接访问 结合网上的例子,实现如下: 1.基于CocoaHTTPServer实现 2.可用pod集成,也可直接拖动文件集成 ...
- __stdio_common_vsnprintf_s,该符号在函数 _vsnprintf_s_l 中被引用
在链接 输入里加入:ucrtd.lib
- Redis集群搭建(转自一菲聪天的“Windows下搭建Redis集群”)
配置Redis参考:http://blog.csdn.net/zsg88/article/details/73715947 使用Ruby配置集群参考:https://www.cnblogs.com/t ...
- 将iPhone5s中的相片批量下载到电脑中
前言:目前我还在使用iPhone5s这款手机,不过由于自己的无知,在使用手机的过程中发现有些用户的体验不是很好,特别是将手机中的相片批量下载到电脑中这件小事,和Android系统相关的手机相比更不好玩 ...
- golang----GC的实现原理
Golang从1.5开始引入了三色GC, 经过多次改进, 当前的1.9版本的GC停顿时间已经可以做到极短.停顿时间的减少意味着"最大响应时间"的缩短, 这也让go更适合编写网络服务 ...
- python ddt 传多个参数值示例
import unittest from ddt import ddt,data,file_data,unpack @ddt class TestDDT(unittest.TestCase): lis ...
- Android webview clearHistory 不符合逾期的解决办法
目前在业务开发中有这么一个需求,切换不同的 Fragment, 切换回 WebView 的Fragment时候,要求是打开的初始页面,然后我在 onHiddenChanged() 方法中加载默认地址, ...
- 译:7.使用Spring MVC服务Web内容
本指南向您介绍了使用Spring创建“hello world”网站的过程.阅读原文:Serving Web Content with Spring MVC 1. 你将会构建什么? 您将构建一个具有静态 ...
- 2. Attention Is All You Need(Transformer)算法原理解析
1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...