[博弈]Atcoder AGC002 E. Candy Piles

来源:互联网 发布:java math 绝对值 编辑:程序博客网 时间:2024/05/16 12:34

把A排序一遍,设刚开始在(0,0)点,那么操作一相当于右移,操作二相当于上移,这就可以用SG函数来解决。

边界的SG值为0,而且可以证明(x,y)的SG值和(x+1,y+1)的SG值相同,但是(x+1,y+1)不是边界

那么x,y同时加1,直到到达边界之前,然后算一下就好了。

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=100010;int n,a[N];int main(){  freopen("1.in","r",stdin);  freopen("1.out","w",stdout);  scanf("%d",&n);  for(int i=1;i<=n;i++) scanf("%d",&a[i]);  sort(a+1,a+1+n,greater<int>());  int p=0;  while(p+1<n && p+1<a[p+2]) p++;  int A=(a[p+1]-p)&1,B=1;  for(int i=p+2;i<=n && a[i]>p;i++) B^=1;  if(A && B) puts("Second"); else puts("First");  return 0;}