首页 > 其他分享 >CodeForces 1844C Particles

CodeForces 1844C Particles

时间:2023-07-16 20:12:06浏览次数:36  
标签:typedef 下标 1844C int 元素 CodeForces long 奇偶性 Particles

洛谷传送门

CF 传送门

原题是 [ARC092E] Both Sides Merger

Key observation:每个元素的下标奇偶性不改变。

于是讨论最后一个数是下标为奇数还是偶数加起来的数。将下标奇偶性相同的元素分开考虑。对于下标奇偶性相同的元素,不难发现答案的上界是所有 \(> 0\) 的元素之和(没有 \(> 0\) 的元素时选一个最大的),并且一定能够构造方案以达到上界。

例如,下面 O 代表对答案有贡献的元素,. 代表没有贡献的元素:

.O.O...O

方案是 .O.O...O \(\to\) O.O...O \(\to\) O...O \(\to\) O.O \(\to\) O

于是分下标奇偶性排序一遍从大到小取即可。复杂度 \(O(n \log n)\)。

code
// Problem: C. Particles
// Contest: Codeforces - Codeforces Round  884 (Div. 1 + Div. 2)
// URL: https://codeforces.com/contest/1844/problem/C
// Memory Limit: 256 MB
// Time Limit: 1000 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;

const int maxn = 200100;

ll n, a[maxn], b[maxn], c[maxn];

void solve() {
	scanf("%lld", &n);
	int t1 = 0, t2 = 0;
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
		if (i & 1) {
			b[++t1] = a[i];
		} else {
			c[++t2] = a[i];
		}
	}
	if (n == 1) {
		printf("%lld\n", a[1]);
		return;
	}
	ll s1 = 0, s2 = 0;
	sort(b + 1, b + t1 + 1, greater<ll>());
	sort(c + 1, c + t2 + 1, greater<ll>());
	for (int i = 1; i <= t1; ++i) {
		if (i > 1 && b[i] < 0) {
			break;
		}
		s1 += b[i];
	}
	for (int i = 1; i <= t2; ++i) {
		if (i > 1 && c[i] < 0) {
			break;
		}
		s2 += c[i];
	}
	printf("%lld\n", max(s1, s2));
}

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

标签:typedef,下标,1844C,int,元素,CodeForces,long,奇偶性,Particles
From: https://www.cnblogs.com/zltzlt-blog/p/17558441.html

相关文章

  • Educational Codeforces Round 33 (Rated for Div. 2)
    EducationalCodeforcesRound33(RatedforDiv.2)https://codeforces.com/contest/893昨日vp,今日补完FD贪心,思路值得学习;E组合数学推式子,式子不难,关键在于模型抽象F主席树,调了老半天,关键在于要理解查询函数的含义,确定什么时候能返回。A.ChessForThree居然卡了快十分......
  • Codeforces Round 896 Div2 A-D题解
    CodeforcesRound896A.Politics这题问的是,给一些人的在n个议题的观点,然后你可以随意安排顺序,每个议题人多的赢,反对派会离开,问随便安排议题,最多留下多少人,包括我自己这个题刚开始愣了半天,但是想到,那只要把所有和我观点一致的给留下来不就行了???然后交上去就AC了ACCode#inclu......
  • Codeforces Round #875 (Div. 2) A-D
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn;cin>>n;for(inti=1;i<=n;i++){intx;cin>>x;cout<<n-x+1<<"......
  • Codeforces Round 884
    目录写在前面ABCDEF1F2学到了什么写在前面比赛地址:https://codeforces.com/contest/1844。什么?你怎么知道我连C都没过掉了一伯伍拾昏?吐槽一下马娘前期甚至动画第一季都没出之前的很多个人角色曲,听起来就是很无聊的动漫op风。比如进王的这首:感觉给哪个笨蛋阳光系角色都能......
  • Educational Codeforces Round 137 (Rated for Div. 2)
    EducationalCodeforcesRound137(RatedforDiv.2) A.Passwordvoidsolve(){intn=read();for(inti=1;i<=n;i++)intx=read();cout<<combination(10-n,2)*6<<'\n';//puts(ans>0?"YES":"NO");......
  • Codeforces Round #881 (Div. 3) A-F
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;inta[57];boolsolve(){intn;cin>>n;for(inti=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);intsum=0;for(inti......
  • Codeforces Round 881 (Div. 3) D - Apple Tree(dfs)
    https://codeforces.com/contest/1843/problem/D题目大意:一颗树中,每次给定两个结点,每个结点都可以移动到孩子结点,最后可以到达叶子结点,问我们这两个结点最终移到叶子结点有多少种组合?(其实就是让求以这两个节点为根的子树的叶子结点个数的乘积)input2512345332......
  • Codeforces Round 875 (Div. 2)
    CodeforcesRound875(Div.2)A-TwinPermutations思路:让序列全相等为n+1即可#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;constintN=2e5+5,INF=0x3f3f......
  • Codeforces Round 884 (Div. 1 + Div. 2)
    CodeforcesRound884(Div.1+Div.2) A-SubtractionGame思路:显而易见为a+b#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;c......
  • Codeforces 1396E - Distance Matching
    先考虑一下合法的\(k\)的上界和下界是什么以及如何达到上界和下界,我们找出树的一个重心\(R\)并以\(R\)为根dfs一遍整棵树,那么:下界为\(\sum(siz_i\bmod2)\),构造方法是从下往上钦定,对于一个点考虑其所有没有匹配的儿子,如果是偶数个就将它们两两匹配,如果是奇数个就将它们......