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 堆中采用的垃圾回收机制为分代收集算法.即将堆分为新生代和老年代,根据不同的区域 ...
随机推荐
- mybatis内置参数及foreach使用
- Appium_Page object设计模式
Page object设计模式思维,把app按页面去划分,一个页面就是一个page对象 每个页面的元素集中管理.页面上按钮操作方法单独封装 # __author__ = " Caric Le ...
- Deep one-class classification
Deep one-class classification 2019-03-17 23:09:59 zpainter 阅读数 1027 收藏 文章标签: 单分类问题异常检测 更多 分类专栏: 论文 ...
- 深度学习Tensorflow相关书籍推荐和PDF下载
深度学习Tensorflow相关书籍推荐和PDF下载 baihualinxin关注 32018.03.28 10:46:16字数 481阅读 22,673 1.机器学习入门经典<统计学习方法&g ...
- iOS-右滑返回,利用Runtime添加全屏Pop手势
项目中经常会遇到类似需求,需要在某控制器增加全屏右滑返回功能. 在我们不隐藏 NavigationBar 的前提下,系统会自动替我增加此功能,只是它作用的范围仅仅在屏幕左边有限区域. 我们需要在整个界 ...
- input里面的提示文字修改(placeholder里的文字修改,el-input也适用)
input::-webkit-input-placeholder { /* WebKit browsers */ color: red; } input:-moz-placeholder { /* M ...
- 聊Java中的任务调度的实现方法及比较
前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz ...
- SQL SERVER-SSMS安装联机丛书 book online
1.下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=42557 2.解压. 3.在SSMS中添加引用. 选择解压路径找到ms ...
- Android笔记(六十四) android中的动画——补间动画(tweened animation)
补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...
- swagger是什么OpenAPI是什么
wiki: https://en.wikipedia.org/wiki/OpenAPI_Specification 官网: https://swagger.io/specification/