首页 > 其他分享 >AtCoder Grand Contest 056 D Subset Sum Game

AtCoder Grand Contest 056 D Subset Sum Game

时间:2023-10-02 09:00:09浏览次数:40  
标签:Subset AtCoder typedef 匹配 Contest Alice long define

洛谷传送门

AtCoder 传送门

考虑若 \(n\) 是奇数怎么做。枚举 Alice 第一次选的数 \(a_i\),然后考虑把剩下的数两两结成一个匹配,若 Bob 选了其中一个,Alice 就选另一个。容易发现排序后奇数位和它右边的偶数位匹配最优。那么设奇数位的和为 \(A\),偶数位的和为 \(B\),此时 Alice 获胜当且仅当 \(L \le A + a_i \land B + a_i \le R\)。

若 \(n\) 是偶数,仍然考虑沿用上面的做法,把数结成匹配做。仍然枚举 Alice 第一次选的数,和这个数匹配的数,那么剩下的数仍然奇数位匹配右边偶数位最优。若 Bob 选了这个数匹配的数,Alice 可以新开一个匹配,否则 Alice 选 Bob 选的数匹配的数即可。

需要枚举 Alice 第一次选的数和这个数匹配的数,复杂度 \(O(n^2)\)。

code
// Problem: D - Subset Sum Game
// Contest: AtCoder - AtCoder Grand Contest 056
// URL: https://atcoder.jp/contests/agc056/tasks/agc056_d
// Memory Limit: 1024 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 mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

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

const int maxn = 5050;

ll n, L, R, a[maxn], b[maxn];

void solve() {
	scanf("%lld%lld%lld", &n, &L, &R);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	}
	sort(a + 1, a + n + 1);
	for (int i = 1; i <= n; ++i) {
		int m = 0;
		for (int j = 1; j <= n; ++j) {
			if (i != j) {
				b[++m] = a[j];
			}
		}
		ll s1 = a[i], s2 = a[i], t1 = 0, t2 = 0;
		for (int j = 1; j <= m; ++j) {
			((j & 1) ? t1 : t2) += b[j];
		}
		for (int j = 1; j <= m; ++j) {
			((j & 1) ? t1 : t2) -= b[j];
			if (L <= s1 + t2 && s2 + t1 <= R) {
				puts("Alice");
				return;
			}
			((j & 1) ? s1 : s2) += b[j];
		}
	}
	puts("Bob");
}

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

标签:Subset,AtCoder,typedef,匹配,Contest,Alice,long,define
From: https://www.cnblogs.com/zltzlt-blog/p/17739696.html

相关文章

  • AtCoder Beginner Contest 178 E
    AtCoderBeginnerContest178EE-DistMax曼哈顿距离最大点对\(ans=max(|x_i-x_j|+|y_i-y_j|)\)考虑去绝对值,4种情况。sort一下取max即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=2e5+10;intx[N],y[N];intp[4][N];......
  • 2022 China Collegiate Programming Contest (CCPC) Weihai Site
    PrefaceVP到自己学校出的题了可海星,不得不说学长们出的题比起昨天VP的CCPC2022广州做起来要舒服地多这场前面写题都很顺基本都是一发过,中期的medium也没怎么卡思路和卡机子,一道一道地慢慢出最后一个小时徐神RushF可惜没Rush出来,然后我和祁神坐在下面把B的做法给搞出来了,但不知......
  • The 2022 ICPC Asia Shenyang Regional Contest
    C.ClampedSequence因为\(n\)的范围不大,并且可以猜到\(l,r\)中应该至少有一个在\(a_i,a_i-1,a_i+1\)上。所以直接暴力枚举\(l\)或\(r\)然后暴力的计算一下#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;int32_tmain(){......
  • AtCoder Beginner Contest 322
    A-FirstABC2解题思路签到Code#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;voidsolve(){ intn; cin>>n; strings; cin>>s; intp=s.find("ABC"); if(p==-1)cout<<p<<'\n&......
  • 2022 China Collegiate Programming Contest (CCPC) Guangzhou Onsite
    Preface好难啊这场广州站,不愧是5题金4题铜的超恶劣站,中档题普遍难度较高但我感觉主要原因还是题目出的太偏向于DP了,AI是本质差不多的树上换根DP,M又是个数位DP,导致像我这种不擅长DP的人直接中期坐牢但好在祁神大力切出了medium~hard的K题,然后最后一小时我把一直在想的A题丢给徐......
  • The 2022 ICPC Asia Xi'an Regional Contest
    C.CloneRanran最优解一定是先复制,在做题。最多只需要复制大约30次,直接枚举即可#include<bits/stdc++.h>usingnamespacestd;#defineintlonglonginta,b,c;voidsolve(){cin>>a>>b>>c;intres=LLONG_MAX;for(inti=0,t=1;i......
  • 2022 China Collegiate Programming Contest (CCPC) Mianyang Onsite
    Preface久违地VP一场,由于CCPC桂林在即因此最近就自主VP一下去年的CCPC这场打的时候全队不在状态,签完到后我就因为A题一个cornercase没考虑到卡了快两个小时然后好不容易搞过去徐神上来有狂WAE题,最后也是喜提+11后面写的D题也是需要特判,好家伙又是快到比赛结束才看出来最后......
  • Gym 104270 The 2018 ICPC Asia Qingdao Regional Programming Contest (The 1st Univ
    A.SequenceandSequenceB.KawaExam可以发现,对答案会产生影响的只有割边,把所有边双缩起来,然后就是一个森林。考虑一个树的时候怎么做,就是对于每条边求出这条边两端的众数个数,考虑线段树合并,每次动态维护子树内的众数和子树外的众数。#include<iostream>#include<cstdio>......
  • 加训日记 Day3——atcoder ABC321乐子场
    Day3,9.23  ·打了场acwing周赛,第三题差点就想出来了,想歪到组合数上乱选了呜呜呜  ·ABC321场写的太抽象了,A题上来wa两次,B题少考虑情况乱wa  ·C题更是重量级,想不出来正确做法直接暴力,结果打表最后少写了几个数,纯纯犯病场  ·最后加了36分没绷住acwing周赛排名atcod......
  • AtCoder Regular Contest 123 F Insert Addition
    洛谷传送门AtCoder传送门用\((x,y)\)表示\(Ax+By\),那么这个等价于SB树。那么直接在SB树上二分,遍历一遍找到\(n\)个点就好了。可以采用类似线段树查询的方式。于是现在还剩下一个子问题:给定\(a,b\),求\(ax+by\len\)且\(\gcd(x,y)=1\)的正整数\((x,y......