题面
这题怎么人均fhqfhqfhq啊,让STLSTLSTL选手情何以堪?

于是就来一发priorityprioritypriority_queuequeuequeue+map的题解吧(突然发现map好慢啊)。

思路上面几位都说得比较清晰了,就是动态维护中位数,然后每次求最小代价,当时我脑袋一热,就想到了对顶堆,就是定义1个小根堆和1个大根堆,每次判断当前的数如果小于大根堆顶,就加入大根堆,否则加入小根堆,这样的话大根堆里的所有的数都比小根堆里的数小了,维护2个堆的大小相差不超过1后,就可以很容易取出中位数了。于是码码码之后发现:

好像要支持删除啊…

不过还有办法,支持搞出删除的堆的套路有2种(pb_ds的走开):

一是把删除的数塞到另一个堆里面,如果2个堆顶相同,就同时删除(注意必须都是小根堆或大根堆)

第二是把数直接放入mapmapmap中,每次取出时要特判

本来本蒟蒻用的是mapmapmap,结果不开O2O_2O2​勇夺最优解倒数第二,实在是不敢看,所以改成了第一种方法。因为对顶堆是一个大根堆一个小根堆,所以删除的堆也要2个。

然后是计算代价的部分了,我们因为是计算绝对值,所以我们是不能把区间的数加起来再减去中位数乘区间数的。但是也好办,我们只要统计大根堆中的数的和sum1sum_1sum1​,数的个数size1size_1size1​以及小根堆的数的和sum2sum_2sum2​,数的个数size2size_2size2​,那么代价为:
Cost=mid∗size1−sum1+sum2−mid∗size2Cost=mid*size_1-sum_1+sum_2-mid*size_2Cost=mid∗size1​−sum1​+sum2​−mid∗size2​
原因也很好理解,因为大根堆中的数都小于等于中位数,所以可以一起加减,小根堆的数都大于等于中位数,所以同理。

代码(开O2O_2O2​后跑到了最优解Rank1Rank1Rank1):

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define int long long
//答案可能会爆int
inline void read(int &x){x=0;int fh=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')fh=-1; c=getchar();}while('0'<=c&&c<='9'){x=x*10+c-48;c=getchar();}x*=fh;
}//快读
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
priority_queue<int>Q1,Q2,D1,D2;
//分别表示大根堆、小根堆、用于删除的2个堆
//因为本蒟蒻记不住pq的格式,就把Q2里的数全部加负号来当成小根堆用,所以下文也会加负号还原
int n,k,a[100005],siz1,siz2,sum1,sum2,ans,Begin,ANS;
//siz1和siz2表示在Q1和Q2中有多少数应被删除但还在堆里
void balance(){while(Q1.size()-siz1>Q2.size()-siz2+1){if(!D1.empty()&&D1.top()==Q1.top()){D1.pop();Q1.pop();siz1--;continue;}sum2+=Q1.top();sum1-=Q1.top();Q2.push(-Q1.top());Q1.pop();}while(Q1.size()-siz1<Q2.size()-siz2){if(!D2.empty()&&D2.top()==Q2.top()){D2.pop();Q2.pop();siz2--;continue;}sum1+=-Q2.top();sum2-=-Q2.top();Q1.push(-Q2.top());Q2.pop();}}
//保持2个堆的平衡,为了方便,我们钦定大根堆数量大于等于小根堆数量,那么我们取中位数就可以在大根堆里取了
signed main(){ans=1e17;read(n);read(k);for(int i=1;i<=n;++i)read(a[i]);for(int i=1;i<=n;++i){if((!Q1.empty()&&a[i]>Q1.top())){Q2.push(-a[i]);sum2+=a[i];}else {Q1.push(a[i]);sum1+=a[i];}balance();if(i>=k){int mid=-1;while(mid==-1){balance();if(Q1.size()-siz1>=Q2.size()-siz2){if(!D1.empty()&&D1.top()==Q1.top()){D1.pop();Q1.pop();siz1--;}else mid=Q1.top();}}//找中位数if(ans>(Q1.size()-siz1)*mid-sum1+sum2-(Q2.size()-siz2 )*mid){ans=(Q1.size()-siz1)*mid-sum1+sum2-(Q2.size()-siz2 )*mid;Begin=i-k+1;ANS=mid;}//求最小代价if(Q1.top()>=a[i-k+1]){siz1++;D1.push(a[i-k+1]);sum1-=a[i-k+1];}else{siz2++;D2.push(-a[i-k+1]);sum2-=a[i-k+1];}//删除}}printf("%lld\n",ans);for(int i=1;i<=n;++i)if(i>=Begin&&i<Begin+k)printf("%lld\n",ANS);else printf("%lld\n",a[i]);return 0;
}

洛谷 P3466 [POI2008]KLO-Building blocks 支持删除的堆相关推荐

  1. 洛谷 P3466 [POI2008]KLO-Building blocks

    洛谷 P3466 [POI2008]KLO-Building blocks 题目: 英文.转链接 题解: fhq-treap,按权分裂. 题目要求"连续K柱的高度是一样",那么这个 ...

  2. BZOJ1112洛谷P3466 [POI2008]KLO-Building blocks(砖头)[对顶堆学习笔记]

    坑爹的BZOJ因为不让 输出方案我WA了若干次 据说正解是平衡树/线段树,我不会,就用了个新东西->对顶堆 对顶堆 一个维护中位数的东西,我们通过维护两个堆,来维所有数的中位数 (显然我们可以排 ...

  3. BZOJ1112: [POI2008]砖块Klo(洛谷P3466)

    平衡树 BZOJ题目传送门 洛谷题目传送门 动态维护中位数,平衡树上一发就好了. 代码: #include<cctype> #include<cstdio> #include& ...

  4. 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)

    P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in B ...

  5. 洛谷 P3469 [POI2008]BLO-Blockade

    思路 这个题有点吓人呢先在这里默认大家都会tarjan找割点了哈 如果你跑tarjantarjantarjan找割点然后把割点删掉跑bfsbfsbfs找连通块,这个O(n2)O(n^2)O(n2)显然 ...

  6. 洛谷P3469 [POI2008]BLO-Blockade(割点过程计算bcc)

    思路:去掉点 i i i后,其他点无论如何都无法到达它了,所以答案首先是 2 ∗ ( n − 1 ) 2*(n-1) 2∗(n−1). 其次,考虑这个点去掉之后,是否会造成一个点无法到达其他点了呢?也 ...

  7. 【洛谷3377】 左偏树(可并堆)

    前言 其实我是不小心翻线性基的时候看见的. Solution 左偏树只会模板,挖坑待补 代码实现 #include<stdio.h> #include<stdlib.h> #i ...

  8. 洛谷 P1550 浇水

    洛谷 1550 浇水 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= ...

  9. DP【洛谷P2134】 百日旅行

    [洛谷P2134] 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场 ...

最新文章

  1. Oracle 触发器 Update 不能操作本表的疑问
  2. python【数据结构与算法】程序设计:划分整数(DP)
  3. 深度学习核心技术精讲100篇(二十九)-基于内容和上下文的音乐推荐
  4. MAC上最好用的免费全能音乐播放器VOX 2.6.5
  5. [css] 解释下css3的flexbox(弹性盒布局模型),以及它应用场景有哪些?
  6. 深度学习(六十五)移动端网络MobileNets
  7. python下载网页中的pdf文件_Python读取网页上的pdf文件,输出字符串
  8. Akka增加消息的灵活性《eleven》译
  9. 探讨一种 Java 实现分组的方法
  10. 【强化学习】CARLA——Windows安装
  11. C++头文件、源文件的编译链接
  12. tar/zip 压缩解压
  13. 高中数学竞赛与自主招生内部练习试题<二>
  14. Photon与Unity核心技术之角色更换武器
  15. linux pthread_attr_destory()
  16. 「涪陵榨菜」使用区块链溯源系统?回应:看榨菜集团的安排
  17. linux阿里云ecs发邮件
  18. C# 合并、拆分PPT幻灯片
  19. Springboot 设置post参数大小: 解决报错The multi-part request contained parameter data (excluding uploaded files
  20. 圆柱模板价格计算器V1.0版本

热门文章

  1. 小学计算机与音乐学科融合教案,【音乐课堂】用教育智慧打造智慧教育——记“基于课程标准的现代信息技术与中小学音乐学科的融合”主题培训...
  2. #R# R语言多元统计包简介:各种假设检验 统计方法 聚类分析 数据处理
  3. 操作系统中不安全状态为何并非一定转为死锁?
  4. 中国史上三个得到天下的顶级流氓
  5. linux系统中arp老化时间计算,Linux实现的ARP缓存老化时间原理解析
  6. c语言 字符串切片重组,c语言 字符串的拼接和分割实例
  7. 移动设备软件开发-6
  8. Anaconda安装 directory xxx already exists
  9. Ultra96基础学习篇——(2)Ultra96初体验
  10. Autodesk CAD帮助文档总结八 DXF ENTITIES