AT_agc002_e [AGC002E] Candy Piles 题解
笔记列表
-
高级题目,好高级好高级好搞机好搞机好
-
首先把 \(a_i\) 从小到大排序,然后按照\(a_i\) 的大小从左到右画柱状图
-
初始时站在 \((1,1)\)
-
选择了取最大值相当于在图上往右走一步从 \((x,y)\to (x+1,y)\)
-
选择了每一个都取一个相当于 \((x,y)\to (x,y+1)\)
-
然后你发现这个转化好高级好搞机好搞机好
-
原问题变成了初始站在\((1,1)\),允许向上和向右,不允许走出边界,不能走的输
-
然后这个题更高级的来了
-
设 \(f_{x,y} 表示\) \((x,y)\)这个位置的必胜必负状态
-
\(f_{x,y} = 1\) 表示必胜
-
\(f_{x,y} = 0\) 表示必败
-
结论: \(f_{x,y} = f_{x+1,y+1}\)
-
证明
- \(f_{x,y}=1\)时,此时说明\(f_{x,y + 1}, f_{x+1,y}\)中必然有一个必败
(因为必胜能到达至少一个必败)不妨设 \(f_{x+1,y}=0\),又因为必败只能走到必胜,所以 \(f_{x+2,y}=f_{x+1,y+1}=1\),此时\(f_{x,y}=f_{x+1,y+1}=1,正好符合结论\) - \(f_{x,y}=0\)时,由于必败只能到达必胜,此时 \(f_{x+1,y}=f_{x,y+1}=1\)。考虑反证,\(f_{x,y} \ne f_{x+1,y+1}\)。那么此时 \(f_{x+1,y+1}=1\)
因为必胜态至少到达一个必败态,所以现在要让\(f_{x+1,y},f_{x,y+1}\)满足条件,则必须 \(f_{x+2,y}=f_{x,y+2}=0\),由于必败只能到必胜,所以\(f_{x+1,y+2}=f_{x+2,y+1}=1\) 然后可以发现现在出现了矛盾。 \(f_{x+1,y+1}\)是必胜态,而它的两个后继状态 \(f_{x+1,y+2}=f_{x+2,y+1}=1\)。所以最开始的反证不成立
- \(f_{x,y}=1\)时,此时说明\(f_{x,y + 1}, f_{x+1,y}\)中必然有一个必败
-
所以从\((1,1)\) 开始已知沿着斜线往上走,必胜必败的状态不变,然后我们一路走到了边界处。然后现在这个位置,不能在斜上走,可能可以往右或上走
-
现在又轮到了先手,那么就以下两边奇偶性,只要有一个先手必胜,先手就会控制往那边,答案是的 \(First\),否则先手必败 \(Second\)
#include<bits/stdc++.h>
#define int long long
#define fore(i,a,b) for( int i=(a); i<=(b); ++i)
#define repe(i,a,b) for( int i=(a); i>=(b); --i)
using namespace std;
const int N = 1e5 + 10;
int n, a[N], pos;
bool cmp(int A,int B) {
return A > B;
}
signed main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin >> n;
fore(i, 1, n) cin >> a[i];
sort(a + 1, a + n + 1, cmp);
fore(i, 0, n) {
if(a[i + 1] < i + 1) {
pos = i;
break;
}
}
int A = a[pos] - pos;
int B = 0;
// cout << A << ' ' << B << '\n';
while(pos + B + 1 <= n && a[pos + B + 1] == pos) ++ B;
if((A & 1) || (B & 1)) cout << "First\n";
else cout << "Second\n";
return 0;
}

浙公网安备 33010602011771号