首页 > 其他分享 >CodeForces 725F Family Photos

CodeForces 725F Family Photos

时间:2023-07-25 15:23:40浏览次数:45  
标签:ge vc int CodeForces a1 Photos 725F b1 b2

洛谷传送门

CF 传送门

不错的贪心题。

我们考虑一对照片只有一张的情况。那么先后手会按照 \(a + b\) 降序取。因为若 \(a_i + b_i \ge a_j + b_j\),变形得 \(a_i - b_j \ge a_j - b_i\) 且 \(b_i - a_j \ge b_j - a_i\),所以对于双方先取 \(i\) 一定是不劣的。

回到原题,如果 \(a_{i, 1} + b_{i, 1} \ge a_{i, 2} + b_{i, 2}\),那么 \((a_{i, 1}, b_{i, 1})\) 和 \((a_{i, 2}, b_{i, 2})\) 会成为先后手争夺的目标,因为双方都想取走上面的。我们把这种物品单独处理,也就是按照 \(a + b\) 降序排序,然后先后手交替取。

取完这种物品后,就还剩下 \(a_{i, 1} + b_{i, 1} < a_{i, 2} + b_{i, 2}\) 的物品,变形得 \((a_{i, 1} - b_{i, 2}) + (b_{i, 1} - a_{i, 2}) < 0\)。分类讨论是哪一项 \(< 0\):

  • 如果 \(a_{i, 1} - b_{i, 2} < 0\) 且 \(b_{i, 1} - a_{i, 2} < 0\),那么这个物品就废掉了,因为双方都不想先取上面的物品,否则会给另一方带来收益。
  • 如果 \(a_{i, 1} - b_{i, 2} < 0\) 且 \(b_{i, 1} - a_{i, 2} \ge 0\),那么 A 肯定不会取 \(a_{i, 1}\),但是 B 取 \(b_{i, 1}\) 一定不劣。这种情况我们把 \(a_{i, 2} - b_{i, 1}\) 累加进答案。
  • 否则 \(a_{i, 1} - b_{i, 2} \ge 0\) 且 \(b_{i, 1} - a_{i, 2} < 0\),这种情况跟上面是对称的,B 肯定不会取 \(b_{i, 1}\),但是 A 取 \(a_{i, 1}\) 一定不劣,把 \(a_{i, 1} - b_{i, 2}\) 累加进答案。
code
// Problem: F. Family Photos
// Contest: Codeforces - Canada Cup 2016
// URL: https://codeforces.com/problemset/problem/725/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair<ll, ll> pii;

void solve() {
	int n;
	scanf("%d", &n);
	vector<pii> vc;
	ll ans = 0;
	while (n--) {
		int a1, b1, a2, b2;
		scanf("%d%d%d%d", &a1, &b1, &a2, &b2);
		if (a1 + b1 >= a2 + b2) {
			vc.pb(a1, b1);
			vc.pb(a2, b2);
		} else if (b1 >= a2) {
			ans += a2 - b1;
		} else if (a1 >= b2) {
			ans += a1 - b2;
		}
	}
	sort(vc.begin(), vc.end(), [&](pii a, pii b) {
		return a.fst + a.scd > b.fst + b.scd;
	});
	for (int i = 0; i < (int)vc.size(); ++i) {
		ans += ((i & 1) ? -vc[i].scd : vc[i].fst);
	}
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:ge,vc,int,CodeForces,a1,Photos,725F,b1,b2
From: https://www.cnblogs.com/zltzlt-blog/p/17579953.html

相关文章

  • Codeforces Round 887 (Div. 2) A-D
    CodeforcesRound887(Div.2)A.Desorting题意:给出一个数组,可以进行任意次以下操作:选择一个i对于数组中的a[1],a[2],...,a[i]全部+1a[i+1]...a[n]全部-1,问最小使得数组变得无序的操作是多少次Solution直接找相邻的两个数的最小的差值即可voidsolve(){ intn;cin>>n......
  • Educational Codeforces Round 71 (Rated for Div. 2)
    EducationalCodeforcesRound71(RatedforDiv.2)A-ThereAreTwoTypesOfBurgers思路:价格高的优先取#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//#defineint__int128typedefpair<int,int>PII;typedefpair<string,int&......
  • 题解 Codeforces Round 887 (Div 1+Div 2) / CF1853AB,CF1852ABCD
    下大分!悲!Div1只过了1A!!!但还是补完整场Div2吧。A.Desortinghttps://codeforces.com/problemset/problem/1853/Aproblem用操作:\([1,i]++,[i+1,n]--\),使得数组不单调不降,求最小操作次数。\(n\leq10^5\)。solution操作等同于在差分数组上选出\(i\),做\(c_1:=c_1+1,c_i:......
  • Codeforces Round #887 Div.2 A-E
    CodeforcesRound#887Div.2一定要手玩哦前言:一定要手玩,一定要手玩!我今早一手玩发现C很TM简单,如果赛时我能切C说不定直接上1800.。。。时隔多年,我的CodeforcesRating(1718)再次超越了@cqbzlhy(1674)!!!赛时错误:B题出得太慢了->劣于pzj半小时。%%%pzjC没有手玩,瞪眼半天......
  • Codeforces Round #885 数学专场
    妙,我只能说妙。今天补DEF发现除了F诡秘的杨辉三角,我都能独立做出来。但为什么我感觉DE难度不如C!!!!A题意:一个人站在\((x,y)\)处,而其他人分别在\((x_1,y_1)\dots(x_n,y_n)\),每一次这个人先移动一步到上下左右四个格子,然后其他\(n\)个人再移动一步,求是否永远这个人与其他人不......
  • Codeforces Round 887 (Div. 2)记录
    A.Desorting如果有$a_1\leqa_2\leq\ldots\leqa_{n-1}\leqa_n$,则称长度为$n$的数组$a$已排序。Ntarsis有一个长度为$n$的数组$a$。他可以对数组进行一种操作(0次或多次):-选择一个索引$i$($1\leqi\leqn-1$)。-将$1$加到$a_1,a_2,\ldots,a_i$。-用$a_{......
  • Codeforces Round 887(Div 2)(A-C)
    A.Desorting题目里说的无序是指后面的一个数大于前面一个数,所以只要有一个a[i+1]-a[i]<0就说明已经符合题目的无序要求了,不需要改变即可,即输出0如果有该序列是非严格递增的根据题目所说的改变就只需要求出最小的差值即可,最后用最小的差值除以2(因为每次可以让选中的部分之前的......
  • 【题解】Imbalanced Arrays - Codeforces 1852B
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/B题目大意:给定一个包含\(n\)个非负整数的频次序列\(f\)。构造任意一个等长的整数序列\(b\),要求①\(b\in[-n,n]\)but$b\neq0$②\(b\)中不存在相反数③对于每个坐标\(i\)......
  • Codeforces Round 886 (Div. 4)
    Dashboard-CodeforcesRound886(Div.4)-CodeforcesA.ToMyCritics判断任意两个大于10即可#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=2e5+10;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);......
  • 【题解】Ntarsis' Set - Codeforces 1852A
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/A题目大意:给定一个包含\(n\)个正整数的表示删除位置的严格升序序列\(p\),以及另外一个连续正整数的被删除的无穷序列\(l\)。进行\(k\)次删除操作,每次操作从无穷序列\(l\)中同时删除位......