99: AGC-018C 堆+思维
$des$
有 $X + Y + Z$ 个人,第 $i$ 个人有 $A_i$ 个金币,$B_i$ 个银币,$C_i$ 个铜币。
选出 $X$ 个人获得其金币,选出 $Y$ 个人获得其银币,选出 $Z$ 个人获得
其铜币,在不重复选某个人的前提下,最大化获得的币的总数。
$sol$
令 $A_i = A_i - C_i, B_i = B_i - C_i$ ,问题变为选出 $X$ 个人获得
其金币,选出 $Y$ 个人获得其银币,再将答案加上 $\sum C_i$.
按 $A_i$ 从大到小排序,枚举选出的 $X$ 个人中 $A_i$ 最小的人,显然这个
人之前的人要么在选出的 $X$ 个人中,要么在选出的 $Y$ 个人中。
因为假设存在 $j \in [1, i]$ 并没有使用 $j$, 那么把 $A_i$ 换成 $A_j$ 答案一定更优
那么只要对每个位置 $i, i \in [X, X + y]$ 计算两个信息:
$i$ 之前 $A_i - B_i$ 最大的 $X$ 个人的 $A_i - B_i$ 的和,这里相当于令所有的 $A_i = A_i - B_i$
最后再加上 $\sum B_i$.
$i$ 之后 $B_i$ 最小的 $Z$ 个人的 $B_i$ 之和, 这 $Z$ 个人是选 $C$ 的。
于是我需要从前往后扫一遍,用小根堆维护当前 $A_i - B_i$ 最大的 $X$ 个人,每加入一个人与堆顶比较;
再从后往前用大根堆维护第二个信息即可。
时间复杂度 $O(nlogn)$
$code$
#include <bits/stdc++.h> #define LL long long using namespace std; #define gc getchar()
inline LL read() {
LL x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} #define Rep(i, a, b) for(int i = a; i <= b; i ++) const int N = 1e5 + ; struct Node {
LL A, B, C, A_B;
} Num[N];
LL L[N], R[N]; priority_queue <LL, vector<LL>, greater<LL> > Q;
priority_queue <LL, vector<LL>, less<LL> > Qu; bool Cmp(Node a, Node b) {
return a.A > b.A;
} int main() {
LL X, Y, Z, n;
LL Sum_C = , Sum_B = , Sum = ; X = read(), Y = read(), Z = read();
n = X + Y + Z;
Rep(i, , n) {
Num[i] = (Node) {read(), read(), read(), };
Sum_C += Num[i].C;
Num[i].A -= Num[i].C, Num[i].B -= Num[i].C;
Num[i].A_B = Num[i].A - Num[i].B;
Sum_B += Num[i].B;
} sort(Num + , Num + n + , Cmp); Rep(i, , X) Q.push(Num[i].A_B), Sum += Num[i].A_B;
L[X] = Sum;
Rep(i, X + , X + Y) {
int a_b = Num[i].A_B, tp = Q.top();
if(a_b > tp) {
Q.pop(); Q.push(a_b); Sum += a_b - tp;
}
L[i] = Sum;
} Sum = ;
for(int i = n; i > X + Y; i --) Qu.push(Num[i].B), Sum += Num[i].B;
R[X + Y + ] = Sum;
for(int i = X + Y; i >= X; i --) {
int b = Num[i].B, tp = Qu.top();
if(b < tp) {
Qu.pop(); Qu.push(b); Sum += b - tp;
}
R[i] = Sum;
} LL Answer = - 1e18;
Rep(i, X, X + Y) {
Answer = max(Answer, L[i] - R[i + ]);
} cout << Answer + Sum_C + Sum_B;
return ;
}
99: AGC-018C 堆+思维的更多相关文章
- Windows堆思维导图--Windows pro sp3
http://bbs.pediy.com/showthread.php?p=1445192#post1445192
- 【做题记录】AtCoder AGC做题记录
做一下AtCoder的AGC锻炼一下思维吧 目前已做题数: 75 总共题数: 239 每一场比赛后面的字母是做完的题,括号里是写完题解的题 AGC001: ABCDEF (DEF) AGC002: A ...
- Stackoverflow上有哪些声望高or值得关注的国人
Stackoverflow上有哪些声望高/值得关注的国人? 以下回答并不严格按照 Reputation 排名来列,也不收录不确定是Chinese(中国人或华人)的用户,欢迎补充- 1.李杨 @Li L ...
- heapy() :python自带的堆排序
堆是一个二叉树,其中每个父节点的值都小于或等于其所有子节点的值.整个堆的最小元素总是位于二叉树的根节点.python的heapq模块提供了对堆的支持. 堆数据结构最重要的特征是heap[0]永远是最小 ...
- JVM(下)
持久代:不会被 gc 给轻易回收的,创建后一直存在,持久代在堆内存里面,但是不归 java 程序使用.持久代是 动态 load 的那些 class,局部变量,去 gc 其实也 gc 不了啥 1.8 之 ...
- AtCoder Grand Contest 035
Preface Atcoder的题都好劲啊,都是我做不动的计数与构造 就当锻炼自己的思维能力了(基本都是bzt教的) A - XOR Circle bzt说这题数据太水了只要判一下所有数异或值是否为\ ...
- C++学习笔记(1)-构造函数与析构函数
1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象. 2.若没有提供任何构造函数,那么c++自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而 ...
- 深度理解JVM
1. 环境搭建 安装jdk 2. 内存溢出场景模拟 public class Test01 { public static void main(String[] args) { //测试内存溢出 ...
- JVM学习笔记——GC算法
GC 算法 GC 即 Garbage Collection 垃圾回收.JVM 中的 GC 99%发生在堆中,而 Java 堆中采用的垃圾回收机制为分代收集算法.即将堆分为新生代和老年代,根据不同的区域 ...
随机推荐
- Spring Aop中execution的语法
参考地址:https://blog.csdn.net/zz210891470/article/details/54175107 execution(* com.sample.service.impl. ...
- WPF 不要给 Window 类设置变换矩阵(分析篇):System.InvalidOperationException: 转换不可逆。
原文:WPF 不要给 Window 类设置变换矩阵(分析篇):System.InvalidOperationException: 转换不可逆. 最近总是收到一个异常 "System.Inva ...
- Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限
Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限, "无法打开 PARADOX.NET.这个文件可以随便删除的,下次会自动产生. Permission ...
- ASP.NET Core & 双因素验证2FA 实战经验分享
必读 本文源码核心逻辑使用AspNetCore.Totp,为什么不使用AspNetCore.Totp而是使用源码封装后面将会说明. 为了防止不提供原网址的转载,特在这里加上原文链接: https:// ...
- 了解Django之前
什么是web应用? 通俗地讲,就是通过浏览器访问一个网址,该网站从后台调取数据,然后把相应的界面展示给用户这样的一个过程. 什么是HTTP协议? 即超文本传输协议:规定了客户端与服务端消息传输的格 ...
- iOS - 安装CocoaPods详细过程(重装系统后!)
重装的系统,发现很多东西都要重装,顺便复习和检验下以前的方法还有没有效 一.简介 什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们 ...
- mysql 的使用
1. 安装 https://dev.mysql.com/downloads/mysql/ 2. 配置 $ vim ~/.bash_profile $ export PATH=$PATH:/usr/lo ...
- BBPlus团队ALPFA冲刺(肖文恒)
ALPHA冲刺博客 第一天:https://www.cnblogs.com/bbplus/p/11931039.html 第二天:https://www.cnblogs.com/bbplus/p/11 ...
- Android笔记(六十七) 自定义控件
实际编程中,系统提供的控件往往无法满足我们的需求,一来是样子丑陋,二来是一些复杂的组合需要多次使用的话,每次都写一堆控件的组合会很耗费时间,所以我们将这些组件的组合自定义为一个新的控件,以后使用的时候 ...
- tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”
试了好多种方法,貌似还是没有解决问题,不过也学到了点东西,记录下备忘吧. 异常详情: 1.首先看到最多的就是说在server.xml中的Connector中添加maxHttpHeaderSize=&q ...