#对顶堆#nssl 1477 赛
分析
首先按小到大排序,考虑枚举两个都喜欢的个数\(i\)
那么只喜欢一个的个数各需要\(k-i\),剩下要补充到\(m-k*2+i\)个,
考虑用对顶堆维护大根堆大小仅有\(m-k*2+i\)即可
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=200011; typedef long long lll; lll ans=1e18,sum;
int n1,n2,n3,like[N],A[N],B[N],C[N],n,m,k,o[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline lll min(lll a,lll b){return a<b?a:b;}
inline void Swap(int &a,int &b){rr int t=a; a=b; b=t;}
struct Max_Heap{
int cnt,heap[N];
inline void Push(int now){
heap[++cnt]=now;
rr int x=cnt;
while (x>1){
if (heap[x]>heap[x>>1])
Swap(heap[x>>1],heap[x]),x>>=1;
else return;
}
}
inline void Pop(){
heap[1]=heap[cnt--];
rr int x=1;
while ((x<<1)<=cnt){
rr int y=x<<1;
if (y<cnt&&heap[y+1]>heap[y]) ++y;
if (heap[y]>heap[x]) Swap(heap[y],heap[x]),x=y;
else return;
}
}
}heap1;
struct Min_Heap{
int cnt,heap[N];
inline void Push(int now){
heap[++cnt]=now;
rr int x=cnt;
while (x>1){
if (heap[x]<heap[x>>1])
Swap(heap[x>>1],heap[x]),x>>=1;
else return;
}
}
inline void Pop(){
heap[1]=heap[cnt--];
rr int x=1;
while ((x<<1)<=cnt){
rr int y=x<<1;
if (y<cnt&&heap[y+1]<heap[y]) ++y;
if (heap[y]<heap[x]) Swap(heap[y],heap[x]),x=y;
else return;
}
}
}heap2;
signed main(){
n=iut(); m=iut(); k=iut();
for (rr int i=1;i<=n;++i) o[i]=iut();
for (rr int T=iut();T;--T) like[iut()]=1;
for (rr int T=iut();T;--T) like[iut()]|=2;
for (rr int i=1;i<=n;++i){
switch (like[i]){
case 0:heap2.Push(o[i]); break;
case 1:A[++n1]=o[i]; break;
case 2:B[++n2]=o[i]; break;
case 3:C[++n3]=o[i]; break;
}
}
sort(A+1,A+1+n1),sort(B+1,B+1+n2),sort(C+1,C+1+n3);
if (k<n3) for (rr int i=k+1;i<=n3;++i) heap2.Push(C[i]);
for (rr int i=1;i<=n1;++i) sum+=A[i];
for (rr int i=1;i<=n2;++i) sum+=B[i];
rr int j1=n1,j2=n2,len=m-n1-n2;
for (rr int i=0,t=min(n3,k);i<=t;++i,--len){
for (;j1>k-i;--j1,++len) heap2.Push(A[j1]),sum-=A[j1];
for (;j2>k-i;--j2,++len) heap2.Push(B[j2]),sum-=B[j2];
if (j1+i>=k&&j2+i>=k){
for (;len>0&&heap2.cnt;heap2.Pop(),--len)
sum+=heap2.heap[1],heap1.Push(heap2.heap[1]);
if (heap1.cnt&&heap2.cnt)
while (heap1.heap[1]>heap2.heap[1]){
rr int X=heap1.heap[1],Y=heap2.heap[1];
heap1.Pop(),heap2.Pop(),sum+=Y-X;
heap1.Push(Y),heap2.Push(X);
}
if (!len) ans=min(ans,sum);
}
sum+=C[i+1];
}
if (ans==1e18) printf("-1");
else printf("%lld",ans);
return 0;
}
#对顶堆#nssl 1477 赛的更多相关文章
- hdu3282 链表或者对顶堆
维护序列的动态中位数 第一次用链表做题..感觉指针指来指去也挺麻烦的.. 本题链表解法就是用数组模拟出一个链表,然后离线输入所有数,排序,按照输入顺序在链表里删除元素,一次性删掉两个,然后中位数指针对 ...
- 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set
题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...
- hdu4261 Estimation[暴力dp+对顶堆]
https://vjudge.net/problem/HDU-4261 对于一个长2000的数列划分最多25个块,每块代价为块内每个数与块内中位数差的绝对值之和,求最小总代价. 套路化地,设$f[i] ...
- 【POJ 3784】 Running Median (对顶堆)
Running Median Description For this problem, you will write a program that reads in a sequence of 32 ...
- P1168 中位数(对顶堆)
题意:维护一个序列,两种操作 1.插入一个数 2.输出中位数(若长度为偶数,输出中间两个较小的那个) 对顶堆 维护一个小根堆,一个大根堆,大根堆存1--mid,小根堆存mid+1---n 这样堆顶必有 ...
- poj3784 Running Median[对顶堆]
由于我不会讲对顶堆,所以这里直接传上一个巨佬的学习笔记. 对顶堆其实还是很容易理解的,想这题的时候自己猜做法也能把没学过的对顶堆给想出来.后来了解,对顶堆主要还是动态的在线维护集合$K$大值.当然也可 ...
- 洛谷 - P1801 - 黑匣子 - 对顶堆
这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为 ...
- bzoj 1112: [POI2008]砖块Klo【对顶堆】
priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...
- 【Luogu P1168】【Luogu P1801&UVA 501】中位数&黑匣子(Black Box)——对顶堆相关
Luogu P1168 Luogu P1801 UVA 501(洛谷Remote Judge) 前置知识:堆.优先队列STL的使用 对顶堆 是一种在线维护第\(k\)小的算法. 其实就是开两个堆,一个 ...
- luogu 3466 对顶堆
显然答案是将一段区间全部转化成了其中位数这样的话,需要维护一个数据结构支持查询当前所有数中位数对顶堆 用两个堆将 < 中位数的数放入大根堆将 > 中位数的数放入小根堆这样就会存在删除操作 ...
随机推荐
- virtualapp 应用启动源码分析
应用启动源码分析 在HomeActvity中的OnCreate方法会调用initLaunchpad private void initLaunchpad() { mLauncherView.setHa ...
- 【Android 逆向】看雪题目:找出flag 如果输入正确则屏幕上的 hello会变成success
1. apk 安装到手机,只有一个输入框,随便输入点什么,提示error 2. apk拖入到jadx中 public class MainActivity extends AppCompatActiv ...
- 第136篇:动画API:setInterval 与 requestAnimationFrame的区别
好家伙,书接上文 function animate() { //请求-动画-框架 requestAnimationFrame( animate ); //改变正方体在场景中的位置,让正方体动起来 ...
- 【Azure Logic App】在Logic App中使用 Transfer XML组件遇见错误 undefined
问题描述 在Azure Logic App中,使用Transform XML组件进行XML内容的转换,但是最近这个组件运行始终失败. 问题解答 点击Transform XML组件上的错误案例,并不能查 ...
- 微信小程序直播,腾讯云直播+微信小程序实现实时直播
一:小程序代码端 小程序直播使用小程序组件 live-pusher 组件和live-player组件 首先开通直播权限 小程序开发工具内进行推流拉流都不会成功,所以需要使用两个手机进行推拉流测试: 1 ...
- react start 后 url 后面不带/ 解决思路
> navigator@0.1.0 dev H:\2020home\giteez\navigator > node scripts/start.js Compiled successful ...
- Java使用Steam流对数组进行排序
原文地址:Java使用Steam流对数组进行排序 - Stars-One的杂货小窝 简单记下笔记,不是啥难的东西 sorted()方法里传了一个比较器的接口 File file = new File( ...
- 快速将json装DTO的GsonFormatPlus插件使用
参考:https://www.jianshu.com/p/8fb0e4274436 https://blog.csdn.net/qq_43039260/article/details/12676582 ...
- Android IjkPlayer解决RTSP延时300ms左右
简介 在上一篇<ijkplayer编译-RTSP>中介绍了,ijkplayer如何进行编译成so库的,以及如何开启rtsp.那么实际在使用的时候会发现延迟不是一般的大. 现在来介绍一下如何 ...
- python基础十(常用模块)
一 time与datetime模块 1.time import time # 时间分为三种格式: # 1.时间戳:从1970年到现在经过的秒数 # 作用:用于时间间隔的计算 print(time.ti ...