CF1903E Geo Game 题解
设博弈过程中依次经过的点的下标为
可见我们只关心起点和终点的
所以我们把
不妨设起点的奇偶性为
放代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int t; cin>>t;
while(t--){
int n,sx,sy; cin>>n>>sx>>sy;
int a=sx+sy&1;
set<int> s[2];
for(int i=0;i<n;i++){
int x,y; cin>>x>>y;
s[x+y&1].emplace(i+1);
} // 存点
auto f=[&](int x){
if(s[x].empty())x=!x;
cout<<*s[x].begin()<<endl;
s[x].erase(s[x].begin());
}; // 向交互库输出一个点
auto g=[&](){
int x; cin>>x;
if(s[0].find(x)!=s[0].end())s[0].erase(x);
else s[1].erase(x);
}; // 从交互库读取一个点
if(s[a].size()>=s[!a].size()){ // 先手必胜
cout<<"First"<<endl;
if(n&1){ // 最后是自己出
for(int i=0;i<n-1;i++)
if(i&1)g();
else f(!a);
f(a);
}
else{ // 最后是对方出
for(int i=0;i<n;i++)
if(i&1)g();
else f(!a);
}
}
else{ // 后手必胜
cout<<"Second"<<endl;
for(int i=0;i<n;i++)
if(i&1)f(a);
else g();
}
}
return 0;
}