分析

首先按小到大排序,考虑枚举两个都喜欢的个数\(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 赛的更多相关文章

  1. hdu3282 链表或者对顶堆

    维护序列的动态中位数 第一次用链表做题..感觉指针指来指去也挺麻烦的.. 本题链表解法就是用数组模拟出一个链表,然后离线输入所有数,排序,按照输入顺序在链表里删除元素,一次性删掉两个,然后中位数指针对 ...

  2. 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set

    题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...

  3. hdu4261 Estimation[暴力dp+对顶堆]

    https://vjudge.net/problem/HDU-4261 对于一个长2000的数列划分最多25个块,每块代价为块内每个数与块内中位数差的绝对值之和,求最小总代价. 套路化地,设$f[i] ...

  4. 【POJ 3784】 Running Median (对顶堆)

    Running Median Description For this problem, you will write a program that reads in a sequence of 32 ...

  5. P1168 中位数(对顶堆)

    题意:维护一个序列,两种操作 1.插入一个数 2.输出中位数(若长度为偶数,输出中间两个较小的那个) 对顶堆 维护一个小根堆,一个大根堆,大根堆存1--mid,小根堆存mid+1---n 这样堆顶必有 ...

  6. poj3784 Running Median[对顶堆]

    由于我不会讲对顶堆,所以这里直接传上一个巨佬的学习笔记. 对顶堆其实还是很容易理解的,想这题的时候自己猜做法也能把没学过的对顶堆给想出来.后来了解,对顶堆主要还是动态的在线维护集合$K$大值.当然也可 ...

  7. 洛谷 - P1801 - 黑匣子 - 对顶堆

    这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为 ...

  8. bzoj 1112: [POI2008]砖块Klo【对顶堆】

    priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...

  9. 【Luogu P1168】【Luogu P1801&UVA 501】中位数&黑匣子(Black Box)——对顶堆相关

    Luogu P1168 Luogu P1801 UVA 501(洛谷Remote Judge) 前置知识:堆.优先队列STL的使用 对顶堆 是一种在线维护第\(k\)小的算法. 其实就是开两个堆,一个 ...

  10. luogu 3466 对顶堆

    显然答案是将一段区间全部转化成了其中位数这样的话,需要维护一个数据结构支持查询当前所有数中位数对顶堆 用两个堆将 < 中位数的数放入大根堆将 > 中位数的数放入小根堆这样就会存在删除操作 ...

随机推荐

  1. Vulnhub内网渗透DC-7靶场通关

    个人博客: xzajyjs.cn DC系列共9个靶场,本次来试玩一下一个 DC-7,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶场推 ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (202)-- 算法导论15.3 1题

    一.对于矩阵链乘法问题,下面两种确定最优代价的方法哪种更高效?第一种方法是穷举所有可能的括号化方案,对每种方案计算乘法运算次数,第二种方法是运行RECURSIVE-MATRIX-CHAIN.证明你的结 ...

  3. AI与人类联手,智能排序人类决策:RLHF标注工具打造协同标注新纪元,重塑AI训练体验

    AI与人类联手,智能排序人类决策:RLHF标注工具打造协同标注新纪元,重塑AI训练体验 在大模型训练的 RLHF 阶段,需要人工对模型生成的多份数据进行标注排序,然而目前缺乏开源可用的 RLHF 标注 ...

  4. 【LeetCode二叉树#09】路径总和I+II,以及求根节点到叶节点数字之和(回溯回溯,还是™的回溯)

    路径总和 力扣题目链接(opens new window) 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的 ...

  5. Jina AI x 矩池云Matpool |神经搜索引擎,一键构建

    图片.视频.语音等非结构化数据在快速增长,随着深度学习技术的不断升级,非结构化数据的搜索也逐渐形成可能.在这样的背景下,专注于神经搜索技术的商业开源软件公司--Jina AI,提出了神经搜索 (Neu ...

  6. ABP模块签入GitLab后自动打包并推送到ProGet

    # 1.添加一个名为下划线的解决方案文件夹 # 2.把解决方案根目录下的几个必要的文件添加到上述文件夹下 # 3.修改NuGet.Config,添加私有NuGet服务器的网址,并配置用户名和密码: A ...

  7. NebulaGraph is nothing without you | 社区 2023 年度人物合集

    在去年的年度人物 回顾中,我们看到了形形色色的人们,他们当中有帮 NebulaGraph 捉 bug 的小能手,也有通过用回复来解答他人疑惑的启蒙者-在今年(2023 年),我们这个整点不一样的,将镜 ...

  8. spark读取和处理zip、gzip、excel、等各种文件最全的技巧总结

    一.当后缀名为zip.gzip,spark可以自动处理和读取 1.spark非常智能,如果一批压缩的zip和gzip文件,并且里面为一堆text文件时,可以用如下方式读取或者获取读取后的schema ...

  9. WireShark学习笔记(一)

    1.从WireShark分析网络层协议的传输 下面是网络接口层协议,从图中可以看到两个相邻设备的MAC地址,因此该网络包才能以接力的方式传送到目的地址. 下面是网络层,在这个包中,主要的任务是把TCP ...

  10. aardio 嵌入 其他应用程序

    aardio 嵌入 其他应用程序 需求 这个chrome壳不能进行拖拽和缩放,所以再套一个壳,可以再分屏的时候用 import win.ui; /*DSG{{*/ winform = win.form ...