E2. Voting (Hard Version)

题意: 有n个人, 你想让他们都给你投票. 你可以选择花费pi收买第i个人, 或者如果有mi个人已经给你投票了, 那么第i个人会自动给你投票.

不妨把题目等价为, 给n个人排一个先后投票的顺序, 假设在这个顺序中, 第k个投票的人, 它的mi不超过k-1, 那么这个人就不需要花钱收买, 否则就需要花钱收买.

那么我们依次考虑第1,2,3,....n个投票的位置让哪个人来投票. 可以发现, 只要我们让"不需要花钱收买的人省下的钱"最大化, 就相当于让代价最小化了.

对于每个位置, 最优化这个位置的收益. 而且越靠前的位置越无用, 所以我们从前往后依次考虑每个位置, 最大化每个位置的收益, 也就是在每个位置考虑能在这个位置避免花钱收买的人, 把其中花钱最多的人放到这个位置. 借助一个堆来实现即可.

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long i64;
const int maxn = 200005;
struct vote{
int m, p;
bool operator < (const vote &b)const{
return m < b.m;
}
}V[maxn];
void work(){
int n;scanf("%d", &n);
for(int i=1;i<=n;++i){
scanf("%d%d", &V[i].m, &V[i].p);
}
sort(V+1, V+n+1);
priority_queue<int> q;
i64 ans = 0;
int pt = 1;
for(int i=0;i<n;++i){
while(pt <= n && V[pt].m<=i){
ans += V[pt].p;
q.push(V[pt].p);
++pt;
}
if(!q.empty()){
ans -= q.top();
q.pop();
}
}
printf("%lld\n", ans);
}
int main(){
int t;scanf("%d", &t);
while(t--)work();
return 0;
}

最新文章

  1. alternatives命令用法
  2. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)
  3. Ecshop文件结构,二次开发
  4. 开发一个struts2的实例
  5. 左右HttpClient上传的方法来解决中国的乱码
  6. JavaScript数组的22种方法
  7. 文件一键上传、汉字转拼音、excel文件上传下载功能模块的实现
  8. 3.jmeter接口测试---脚本录制
  9. Centos7关闭防火墙
  10. 非交互式一句话添加root用户
  11. Qt创建任务栏进度条
  12. 5、 LwIP协议栈规范翻译——操作系统仿真层
  13. MySQL学习(四) SQL连接查询
  14. 使用 ffmpeg 转换视频格式
  15. 知物由学 | 见招拆招,Android应用破解及防护秘籍
  16. libevent 入门教程:Echo Server based on libevent(转)
  17. Django配置celery执行异步任务和定时任务
  18. Node.js 连接 MongoDB-7
  19. k8s内核参数调优
  20. Java 异常模型综述

热门文章

  1. Fineui 实现点击左边树状主菜单链接 打开新窗口或打开多个同一个tab
  2. python学习-29 map函数-filter函数
  3. vue中sessionStorage的使用
  4. 《JAVA高并发编程详解》-类的加载过程简介
  5. flickity:支持触摸滑动,响应迅速的幻灯片轮播插件
  6. 【开发工具】- Atom下载及安装
  7. Vue v-bind与v-model的区别
  8. Excel工作表密码保护的破解
  9. 企业如何避免错误决策?APS系统帮你忙
  10. 一个工作13年的SAP开发人员的回忆:电子科技大学2000级新生入学指南