首页 > 其他分享 >Codeforces Round 912 (Div. 2) E - Geo Game

Codeforces Round 912 (Div. 2) E - Geo Game

时间:2023-12-01 19:22:05浏览次数:40  
标签:return int Codeforces dfs st Game && Div size

考虑什么时候会改变答案的奇偶,显然可以根据\(x \oplus y\)的奇偶性分组,在组内进行跳跃不会改变,只有当组间跳跃的时候才会改变。

打表观察先手什么时候必胜,其中:\(u\)是当前获胜目标为奇/偶(1/0),\(v\)是位于哪一组,\(a,b\)代表两组还剩多少,\(st\)代表当前答案的奇偶性。

int dfs(int u, int v, int a, int b, int st) {
	if (a == 0 && b == 0) return (u == st);
	if (a == 0) {
		if (v == 0) return !dfs(u ^ 1, v ^ 1, a, b - 1, st ^ 1);
		else return !dfs(u ^ 1, v, a, b - 1, st);
	}
	if (b == 0) {
		if (v == 0) return !dfs(u ^ 1, v, a - 1, b, st);
		else return !dfs(u ^ 1, v ^ 1, a - 1, b, st ^ 1);
	}
	if (v == 0) {
		if (dfs(u ^ 1, v ^ 1, a, b - 1, st ^ 1) && dfs(u ^ 1, v, a - 1, b, st)) return 0;
		return 1;
	}
	else {
		if (dfs(u ^ 1, v ^ 1, a - 1, b, st ^ 1) && dfs(u ^ 1, v, a, b - 1, st)) return 0;
		return 1;
	}
}

void work() {
	rep (i, 0, 20) {
		rep (j, 0, 20) {
			if (dfs(0, 0, i, j, 0)) {
				cout << i << " " << j << "\n";
			}
			// cout << i << " " << j << " " << dfs(0, 0, i, j, 0) << " " << dfs(0, 1, i, j, 0) << "\n";
		}
	}
	
}

根据表,发现只要先手位于的组元素数量大于等于另一组就必胜, 否则必败。

其实这时候就可以根据必胜/必败态转移了,但我比较唐氏,选择肉眼观察必胜策略。

发现不管选择先手还是后手,只要一直跳一开始元素数量较少的那一组就行了,可以手玩一下

void work() {
    int n, sx, sy, st;
    cin >> n >> sx >> sy;
    if ((sx ^ sy) & 1) st = 0;
    else st = 1;
    set<int> a, b;
    rep (i, 1, n) {
    	int x, y;
    	cin >> x >> y;
    	if ((x ^ y) & 1) a.insert(i);
    	else b.insert(i);
    }
    if ((st == 0 && a.size() >= b.size()) || (st == 1 && b.size() >= a.size())) {
    	if (b.size() > a.size() || (a.size() == b.size() && st == 1)) swap(a, b);
    	cout << "First" << endl;
    	rep (i, 1, n) {
    		if (i & 1) {
    			if (b.size()) {
					cout << *prev(b.end()) << endl;
					b.erase(prev(b.end()));
				}
				else {
					cout << *prev(a.end()) << endl;
					a.erase(prev(a.end()));
				}
    		}
    		else {
    			int id;
    			cin >> id;
    			if (a.size() && a.find(id) != a.end()) {
    				a.erase(a.find(id));
    			}
    			else {
    				b.erase(b.find(id));
    			}
    		}
    	}
    } 
    else {
    	if (b.size() >= a.size()) swap(a, b);
    	cout << "Second" << endl;
    	rep (i, 1, n) {
    		if (!(i & 1)) {
    			if (b.size()) {
					cout << *prev(b.end()) << endl;
					b.erase(prev(b.end()));
				}
				else {
					cout << *prev(a.end()) << endl;
					a.erase(prev(a.end()));
				}
    		}
    		else {
    			int id;
    			cin >> id;
    			if (a.size() && a.find(id) != a.end()) {
    				a.erase(a.find(id));
    			}
    			else {
    				b.erase(b.find(id));
    			}
    		}
    	}
    }
}
/*

*/

标签:return,int,Codeforces,dfs,st,Game,&&,Div,size
From: https://www.cnblogs.com/xhy666/p/17870730.html

相关文章

  • 【ErikTse】2023-Codeforces新手训练营 第六期题解
    A.Wrath题目大意给你一个\(L\)数组和\(n\)个人,第\(i\)个人可以使用威力为\(L_i\)的闪电旋风劈击杀前面\(L_i\)人,问你最后能存活多少人?思路差分。开一个数组来标记当前威力的闪电旋风劈能击杀到的最远的人和使用技能的人,最远击杀的人所在的位置+1,自己的位置-1,这样算前缀和时所......
  • Codeforces Round 912 (Div. 2)
    CodeforcesRound912(Div.2)基本概述最难受的一集。A题秒了。B题幸苦推了两个小时,最后也通过了pretest了,结果赛后被HACK。C题知道是DP,但觉得不好推状态转移方程,所以全心全意去做B题了。爆掉\(150\)分B.StORageroom我的思路其实就几乎是答案。之前几乎没怎......
  • RuCode 2020 Division A+B. I ✖ [PR #5] 和平共处
    前言认认真真学习了一下这道题相关的做法以及有关的二分图网络流理论,感觉自己又刷新了一些东西的理解。所以说我们就从普通的二分图匹配开始吧!二分图匹配众所周知,二分图最大匹配可以用网络流Dinic算法做到\(O(m\sqrtn)\)的复杂度。在某些特定的图下,我们有一种“贪心流”......
  • [Codeforces] CF1591C Minimize Distance
    CF1591CMinimizeDistance题目一条线上有\(n\)(\(1\len\le2\cdot10^5\))个仓库,第\(i\)个仓库的位置是\(x_i\)(\(1\lei\len\))。你有\(n\)箱货物,要分别运到这\(n\)个仓库里。你的初始位置在点\(0\),一次可以携带\(k\)(\(1\lek\len\))箱货物。在送完携带......
  • [Codeforces] CF1603A Di-visible Confusion
    CF1603ADi-visibleConfusion题目给一个长度为\(n\)的序列\(a_1,a_2,\dots,a_n\),对于每个位置\(i\),如果\(a_i\%\left(i+1\right)\not=0\),就可以将\(a_i\)删掉。删掉之后,后面的数都会往前面移动一位。问能否将序列删成空。数据范围\(1\let\le10^4,1\len\le10^5,1\le......
  • [AGC052C] Nondivisible Prefix Sums 题解
    题目链接点击打开链接题目解法好题!一个序列是不合法的,必定满足某些结论,我们不妨猜测一下首先如果和为\(P\)的倍数,必定不合法然后手玩几个可以发现,最极限的情况是\(P-1\)个\(1\;+\;\)\(b_i\;+\;\)\(P-b_i\)如果在这个情况下再加一个\(1\),就爆了其中\(1\)可以替......
  • Codeforces Round 883 (Div. 3)
    CodeforcesRound883(Div.3)A.RudolphandCuttheRope题意:有一颗糖果在连在绳子上,求剪短多少根绳子,他能落地思路:只要绳子长度比钉子高度大就不用减#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,res=0;cin>>n;while(n--)......
  • Codeforces Round 911 (Div. 2)
    CodeforcesRound911(Div.2)基本情况A题秒了。B题条件没想明白,也不造点数据就无脑交,导致罚了不少时。B.LauraandOperations我先推出了,对于一个数,当另外两个数的个数之和为偶数时解可行,且这个数本身要能跟后面数替换。比如11223333就可以操作122333(1......
  • Codeforces Round 910 (Div. 2)
    https://codeforces.com/contest/1898C题可以造一个大小为4的环,然后再造一个来回,这样就解决了%4=0,%4=2的情况,而奇数的情况显然无解。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<vector>#include<set>#includ......
  • Codeforces Round 829 (Div. 1)A1. Make Nonzero Sum (easy version)(思维找规律)
    先考虑无解的情况:当n为奇数时无解相邻的两个元素一定可以变成0\[a[i]!=a[i+1]时,分成[i,i],和[i+1,i+1]\]\[a[i]=a[i+1]时,分成[i,i+1]\]这两种情况对答案的贡献都是0,当n为奇数时我们总会有一个没办法凑成0.#include<bits/stdc++.h>#definelsp<<1#......