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\)。所以最开始的反证不成立
  • 所以从\((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;
}

posted @ 2026-09-18 07:56  wmq2012  阅读(3)  评论(0)    收藏  举报