首页 > 其他分享 >[AGC018C] Coins 题解

[AGC018C] Coins 题解

时间:2024-11-16 16:08:15浏览次数:1  
标签:Node int 题解 Coins cin MAXN AGC018C

先全部选 \(a_i\),假设 \(b_i=b_i-a_i,c_i=c_i-a_i\)。

那么题目转化为选 \(y\) 个 \(b\) 和 \(z\) 个 \(c\) 使得答案最大。

会发现若 \(i\) 位置选的 \(b\),\(j\) 位置选的 \(c\),那么需要满足 \(b_i-c_i>b_j-c_j\)。

我们按上述条件排序,这样一定是在左边选 \(b\),右边选 \(c\)。

那么题目又简化为给定数组 \(b\),在前 \(i\) 个里面选出 \(y\) 个数的最大和,直接反悔贪心即可。

//dzzfjldyqqwsxdhrdhcyxll
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 1e5 + 10;
int x,y,z,n,sum,f[MAXN],g[MAXN],ans = -1e18;
struct Node {
	int a,b,c;
}q[MAXN];
inline bool cmp(Node x,Node y) {
	return x.b - x.c > y.b - y.c;
} 
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> x >> y >> z;
	n = x + y + z; 
	for(int i = 1;i <= n;i++) {
		cin >> q[i].a >> q[i].b >> q[i].c;
		sum += q[i].a;
		q[i].b -= q[i].a;
		q[i].c -= q[i].a;
	}
	sort(q + 1,q + n + 1,cmp);
	priority_queue <int,vector <int>,greater <int> > Q; 
	for(int i = 1;i <= n;i++) {
		if(Q.size() < y) {
			f[i] = f[i - 1] + q[i].b;
			Q.push(q[i].b);
		} else {
			f[i] = f[i - 1];
			if(Q.top() < q[i].b) {
				f[i] += q[i].b - Q.top();
				Q.pop();
				Q.push(q[i].b);
			}
		}
	}
	while(!Q.empty()) Q.pop();
	for(int i = n;i >= 1;i--) {
		if(Q.size() < z) {
			g[i] = g[i + 1] + q[i].c;
			Q.push(q[i].c);
		} else {
			g[i] = g[i + 1];
			if(Q.top() < q[i].c) {
				g[i] += q[i].c - Q.top();
				Q.pop();
				Q.push(q[i].c);
			}
		}
	}
	for(int i = y;i <= n - z;i++) {
		ans = max(ans,f[i] + g[i + 1]);	
	}
	cout << ans + sum;
	return 0;
} 

标签:Node,int,题解,Coins,cin,MAXN,AGC018C
From: https://www.cnblogs.com/Creeperl/p/18549433

相关文章

  • 题解:ABC013D 阿弥陀
    先考虑\(D=1\),明显可以\(O(M)\)模拟预处理出在最上面的每个位置往下走会走到什么位置,之后每次就可以\(O(1)\)查询了。当\(D>1\)时,可以依赖预处理的数据每次\(O(D)\)暴力查询。又注意到每次对所有位置进行的变换操作是一样的,可以倍增后用类似快速幂的方法优化到\(O(\log......
  • CF2031D 题解
    原题链接最后悔的一集,感觉D\(<\)everything。考虑由确定的点推出其他点的答案,发现最高点的答案是确定的,设其位置为\(x\)。然后根据题目定义,发现可以分成\([1,x-1],[x,n]\)两个区间,\([x,n]\)答案均为\(h_x\)。对于\([1,x-1]\)区间,我们找到第一个\(>[x,n]\)区间最小......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道05数据标准化
    1. 批处理1.1. 批处理在一段时间内收集数据,然后将大量数据“批处理”在离散的数据包中1.2. 直到20世纪10年代中期,批处理都是处理分析型数据最常用的方法1.3. 批处理比流处理要便宜得多,即使是对时间要求最苛刻的处理需求也足以满足1.4. 批处理是经过时间考验的标准,并且仍......
  • POI 四题题解
    P3434[POI2006]KRA-TheDisks考场上不知道在想什么,把\(O(n)\)正解改成\(O(n\mathrm{log}n)\)的了。关于\(O(n\mathrm{log}n)\)做法很多,我只讲我的。直接二分盘子会在哪里卡住,二分范围是\(1\simlst\)。\(lst\)表示上一个盘子卡住的位置。\(\mathrm{Code}\)#includ......
  • CF1909F1 Small Permutation Problem (Easy Version) 题解
    CF1909F1SmallPermutationProblem(EasyVersion)题解直接莽做显然不好统计。考虑统计每一次\(i\)的变化有多少种方案数来匹配,也就是对\(a\)数组差分。考虑到对于\(a_i\),只有\([1,i]\)里的数会对\(a_i\)有影响。注意到\(p\)形成一个排列,于是我们不妨考虑此时\(p......
  • [题解]P5687 [CSP-S2019 江西] 网格图
    P5687[CSP-S2019江西]网格图简单来说题目就是给定一个\(n\timesm\)的网格图,同行边权相同,同列边权相同,求该网格图的最小生成树。根据Kruskal算法的贪心思想,我们要优先选择权值尽可能小的行,并将这条边应用于尽可能多的列。列方向同理。为了保证最终生成树的连通性,我们显然要......
  • 题解: BZOJ3517 翻硬币
    ProblemLinkBZOJ3517翻硬币题目描述有一个\(n\)行\(n\)列的棋盘,每个格子上都有一个硬币,且\(n\)为偶数。每个硬币要么是正面朝上,要么是反面朝上。每次操作你可以选定一个格子\((x,y)\),然后将第\(x\)行和第\(y\)列的所有硬币都翻面。求将所有硬币都变成同一个面最少......
  • ISCTF比赛PWN题前三题题解
    萌新第一次发布题解,如有错误还请各位大佬指出。本次比赛个人pwn出题情况,还是太菜了,后面四题基本看不懂girlfriend解题思路:利用填充覆盖检查位置,绕过前面admin检查,进入vuln函数,经过动调发现,每次数据存放位置,从而达到提权解题过程存在后门函数read可以读取0x30大小,观察buf......
  • P9870 [NOIP2023] 双序列拓展 题解
    P9870[NOIP2023]双序列拓展题解NOIP2023T3,特殊性质题。什么是特殊性质题?就是题目给出了你极其神秘的性质,从而引导你想出正解。本篇题解将从部分分的角度,一步步讲述部分分与正解的关系。这样看的话,本题会变得十分简单。\(\text{Task}1∼7,O(Tnm)\)简化题意其实就是要求......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解总结
    AtCoderBeginnerContest379Rated:\(770\)A-Cyclic简单模拟。B-Strawberries字符串模拟,substr函数秒了C-Repeating中等模拟。思路:判断是否合法很简单,重点在计算花费。假设我们是\(0\)号点有\(N\)个棋子,然后移动到每个点上,显然花费为\(\frac{N(N+1)}{......