bzoj 1112: [POI2008]砖块Klo【对顶堆】
priority_queue实现的对顶堆,细节超级多WA了十几次……但是理论上是最简便的orz其实是我已经不会写平衡树了
枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一个支持插入删除查询中位数的东西,我们使用对顶堆
然后关于删除,我们手动维护size和sum,删的时候直接减掉就行,然后堆里面放二元组高度和i,需要使用堆顶的时候,把i<l的pop掉就是可用堆顶了
注意q1最大值<=q2最小值,虽然判了但是还是会WA,在调整size的时候顺便判一下即可
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=100005;
int n,m,a[N],bl[N];
long long sm1,sm2,si1,si2,mn,ansl,ansm;
struct qwe
{
int v,id;
qwe(int V=0,int ID=0)
{
v=V,id=ID;
}
bool operator < (const qwe &b) const
{
return v<b.v;
}
};
struct ewq
{
int v,id;
ewq(int V=0,int ID=0)
{
v=V,id=ID;
}
bool operator < (const ewq &b) const
{
return v>b.v;
}
};
priority_queue<qwe>q1;
priority_queue<ewq>q2;
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void del(int i)
{
while(!q1.empty()&&q1.top().id<i)
q1.pop();
while(!q2.empty()&&q2.top().id<i)
q2.pop();
}
void tiao(int i)
{
del(i);
while(!q1.empty()&&!q2.empty()&&q1.top().v>q2.top().v)
{
del(i);
si1--,si2++;
sm1-=q1.top().v,sm2+=q1.top().v;
q2.push(ewq(q1.top().v,q1.top().id)),q1.pop();
}
while(si1<si2)
{
del(i);
si1++,si2--;
sm1+=q2.top().v,sm2-=q2.top().v;
bl[q2.top().id]=1;
q1.push(qwe(q2.top().v,q2.top().id)),q2.pop();
}
while(si1-1>si2)
{
del(i);
si1--,si2++;
sm1-=q1.top().v,sm2+=q1.top().v;
bl[q1.top().id]=2;
q2.push(ewq(q1.top().v,q1.top().id)),q1.pop();
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=m;i++)
q1.push(qwe(a[i],i)),sm1+=a[i],si1++,bl[i]=1;
tiao(1);
ansl=1,ansm=q1.top().v,mn=ansm*si1-sm1+sm2-ansm*si2;//cerr<<endl;
//cerr<<q1.top().id<<" "<<q1.top().v<<" "<<sm1<<" "<<sm2<<" "<<si1<<" "<<si2<<endl;
for(int i=2;i+m-1<=n;i++)
{
if(bl[i-1]==1)
sm1-=a[i-1],si1--;
else
sm2-=a[i-1],si2--;
tiao(i);
del(i);
if(a[i+m-1]<=q1.top().v)
q1.push(qwe(a[i+m-1],i+m-1)),sm1+=a[i+m-1],si1++,bl[i+m-1]=1;
else
q2.push(ewq(a[i+m-1],i+m-1)),sm2+=a[i+m-1],si2++,bl[i+m-1]=2;
tiao(i);
del(i);
// cerr<<q1.top().id<<" "<<q1.top().v<<" "<<sm1<<" "<<sm2<<" "<<si1<<" "<<si2<<endl;
if(q1.top().v*si1-sm1+sm2-q1.top().v*si2<mn)
ansl=i,ansm=q1.top().v,mn=ansm*si1-sm1+sm2-ansm*si2;
}
printf("%lld\n",mn);
// for(int i=1;i<=n;i++)
// {
// if(i>=ansl&&i<=ansl+m-1)
// printf("%lld\n",ansm);
// else
// printf("%d\n",a[i]);
// }
return 0;
}
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 【区间K大】
题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...
- 线段树 || BZOJ 1112: [POI2008]砖块Klo
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1112 题解: 希望有连续K柱的高度是一样的,就先把1~K的数扔进线段树(线段树的下标就是数值 ...
- BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1112 [题目大意] 给出一个数列,对于一个操作,你可以对一个数+1,或者一个数-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(splay)
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2353 Solved: 831[Submit][Statu ...
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
随机推荐
- 简述WEB项目前端脚本的一次重构历程,labJs,requireJs实践[转载]
重构前的状态: 大量的js代码混在繁多的Jsp文件中,对第三方的js库依赖也很杂乱.虽然在部分交互性较强的页面中,将js代码分离到了独立的js文件中,但是代码结构及依赖管理依然很乱.不说新人来了 ...
- Xcode warning: code will never be executed.
在xcode编译的时候,提示了code will never be executed这个警告.百度了一下,大体的意思是,该代码永远不会执行的意思. 比如: - (void)setMyStyle:(Ad ...
- HDU 5514 容斥原理
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- Sudoku Killer--hdu1426(数独 跟上一题差不多 但是输入时问题)
http://acm.hdu.edu.cn/showproblem.php?pid=1426 注意输入问题就行 还是dfs #include<stdio.h> #include<st ...
- 生产环境之Nginx高可用方案
准备工作: 192.168.16.128 192.168.16.129 两台虚拟机.安装好Nginx 安装Nginx 更新yum源文件: rpm -ivh http://nginx.org/packa ...
- [Javascript] Use JavaScript's for-in Loop on Objects with Prototypes
Loops can behave differently when objects have chained prototype objects. Let's see the difference w ...
- Dom对象的经常用法
Dom对象的经常用法: (1)getElementById() 查询给定ID属性值的元素,返回该元素的元素节点 1. 查询给定ID属性值的元素,返回该元素的元素节点.也称为元素对象. ...
- HTC 328T 提示手机存储不足 out of space怎么办
不要再用什么软件做优化,做清理,都是治标不治本啊. 1 用豌豆荚备份数据 2 手机恢复出厂设置 3 用豌豆荚恢复数据
- shutdown abort模式丢失redo,使用隐含參数启库
shutdown abort模式 丢失redo log 无法open数据库 通过告警报错ORA-00354: corrupt redo log block header 从该错误能够看出当前日志的re ...
- web爬虫之登录google paly 商店
我们先打开Google play 首页 ,点击右上角"登陆"button,即跳到登陆页面 每次我要用爬虫的方式来登陆某个站点的时候,我都会先随便输入一个账号password点击登陆 ...