把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;
}