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:从仓库中拿出一块砖,放到另 ...
随机推荐
- Space Ant--poj1696(极角排序)
http://poj.org/problem?id=1696 极角排序是就是字面上的意思 按照极角排序 题目大意:平面上有n个点然后有一只蚂蚁他只能沿着点向左走 求最多能做多少点 分析: 其实 ...
- 微服务 Framework
Dubbo :https://github.com/dubbo Spring Cloud :https://github.com/spring-cloud
- HDU3926Hand in Hand(搜索 或 并查集)
Problem Description In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the k ...
- 支付宝移动支付之IOSApp调用支付宝钱包
近期客户提出要开发一个IOS上的app作为訪问他们站点的途径之中的一个.为什么说之中的一个呢.因为眼下PC和Mobile这两个站眼下都已经上线了. 所以问题就简单了,我们仅仅须要把mobile站UI改 ...
- API Copy Big FIles
public class ApiCopyFile { private const int FO_COPY = 0x0002; private const int FOF_ALLOWUNDO = 0x0 ...
- C#中泛型方法与泛型接口 C#泛型接口 List<IAll> arssr = new List<IAll>(); interface IPerson<T> c# List<接口>小技巧 泛型接口协变逆变的几个问题
http://blog.csdn.net/aladdinty/article/details/3486532 using System; using System.Collections.Generi ...
- (原创)EasyUI中datagrid的行编辑模式中,找到特定的Editor,并为其添加事件
有时候在行编辑的时候,一个编辑框的值要根据其它编辑框的值进行变化,那么可以通过在开启编辑时,找到特定的Editor,为其添加事件 // 绑定事件, index为当前编辑行 var editors = ...
- 2014/4/18 ① button与submit的区别 ②现象 : 数据库中其他值可以取到 有的却取不到 解决 看获取时“#”有无
①<input type="button" /> 这就是一个按钮.如果你不写javascript 的话,按下去什么也不会 发生. <input type=&quo ...
- 解决IOS滑动页面fixed浮动问题
<div style="position: fixed"></div> <div style="height: 100%; overflow ...
- jquery ajax 回调函数
function test(callback){ $.ajax({ url:'/mall/credit', type: 'get', dataType:'json', processData: fal ...