RT,求一个 hack 策略,不用帮调,谢谢大佬们 QAQ
#include<bits/stdc++.h>
#define il inline
using namespace std;
il int read()
{
int xr=0,F=1; char cr=getchar();
while(cr<'0'||cr>'9') {if(cr=='-') F=-1;cr=getchar();}
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
const int N=105;
int n,a[N][N];
struct node{
int w,to;
};
bool cmp1(node x,node y) {return x.w<y.w;}
bool cmp2(node x,node y) {return x.w>y.w;}
vector<node> el[N],er[N];
int rkl[N][N],rkr[N][N],matl[N],matr[N],vis[N];
bool dfs(int u)
{
for(node vv:el[u])
{
int v=vv.to;
if(vis[v]) continue;vis[v]=1;
if(!matr[v]) {matl[u]=v,matr[v]=u;return 1;}
else if(rkr[v][u]<rkr[v][matr[v]])
{dfs(matr[v]);matl[u]=v,matr[v]=u;return 1;}
}
return 0;
}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
cout<<'B'<<endl;cout.flush();
char c;cin>>c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(c=='I')
el[i].push_back({a[i][j],j}),
er[j].push_back({a[i][j],i});
else
el[i].push_back({-a[i][j],j}),
er[j].push_back({-a[i][j],i});
}
for(int i=1;i<=n;i++)
{
sort(el[i].begin(),el[i].end(),cmp2);
for(int j=1;j<=n;j++)
rkl[i][el[i][j-1].to]=j;
}
for(int i=1;i<=n;i++)
{
sort(er[i].begin(),er[i].end(),cmp1);
for(int j=1;j<=n;j++)
rkr[i][er[i][j-1].to]=j;
}
memset(matl,0,sizeof(matl)),memset(matr,0,sizeof(matr));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
dfs(i);
}
// for(int i=1;i<=n;i++) cout<<matl[i]+n<<" ";
// cout<<endl;
int st=read();
if(st!=-1)
{
while("qwq")
{
if(st<=n) cout<<matl[st]+n<<endl;
else cout<<matr[st-n]<<endl;
//st=read();
cin>>st;
if(st==-1||st==-2) break;
}
}
for(int i=1;i<=n;i++) el[i].clear(),er[i].clear();
}
int main()
{
// int T=read();
int T;cin>>T;
while(T--) solve();
return 0;
}
/*
2
3
3 1 9
2 5 7
6 4 8
*/