就是第二篇题解的做法。
wa on test 2
#include<cstdio>
#include<vector>
#include<algorithm>
#include<windows.h>
#define wzf
namespace interactor
{
int n,p[105][105];
void add(int x,int y){p[x][y]=1;}
int ask1(int x,int y)
{
if (!(0<=x&&x<n)) return -1;
if (!(0<=y&&y<n)) return -1;
if (x==y) return -1;
return p[x][y];
}
int ask2(int x,std::vector<int> s)
{
std::sort(s.begin(),s.end());
for (int i=1;i<(int)s.size();i++) if (s[i]==s[i-1]) return -1;
for (int i=0;i<(int)s.size();i++) if (!(0<=s[i]&&s[i]<n)||x==s[i]) return -1;
for (int i=0;i<(int)s.size();i++) if (p[x][s[i]]) return 1;
return 0;
}
int ask3(int g[105][105])
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (g[i][j]!=p[i-1][j-1]) return -1;
return 1;
}
int getn()
{
return n;
}
void clear()
{
for (int i=0;i<n;i++) for (int j=0;j<n;j++) p[i][j]=0;
}
void floyd()
{
for (int k=0;k<n;k++)
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
p[i][j]=p[i][j]||(p[i][k]&p[k][j]);
}
void read()
{
scanf("%d",&n);
for (int i=0;i<n;i++) for (int j=0;j<n;j++) p[i][j]=(i==j);
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++)
{
int x;
scanf("%d",&x);
if (x==1) add(i,j);
else add(j,i);
}
floyd();
puts("-------------------");
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++) printf("%d ",p[i][j]);
puts("");
}
puts("--------------");
}
}
int n,f[105],p[105],g[105][105];
int ask1(int x,int y)
{
printf("%d %d %d\n",1,x-1,y-1);
fflush(stdout);
int ret;
#ifndef wzf
scanf("%d",&ret);
#else
ret=interactor::ask1(x-1,y-1);
#endif
if (ret==-1) exit(1);
return ret;
}
int ask2(int l,int r,int x)
{
printf("2 %d %d ",f[x]-1,r-l+1);
for (int i=l;i<=r;i++) printf("%d ",f[i]-1);
puts("");
fflush(stdout);
int ret;
#ifndef wzf
scanf("%d",&ret);
#else
std::vector<int> vec;
for (int i=l;i<=r;i++) vec.push_back(f[i]-1);
ret=interactor::ask2(f[x]-1,vec);
#endif
if (ret==-1) exit(1);
return ret;
}
int cmp(int x,int y)
{
return ask1(x,y);
}
void print()
{
puts("3");
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++) printf("%d",g[i][j]);
puts("");
}
fflush(stdout);
int res;
#ifndef wzf
scanf("%d",&res);
#else
res=interactor::ask3(g);
#endif
if (res==-1) exit(1);
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
#ifndef wzf
scanf("%d",&n);
#else
interactor::read();
n=interactor::getn();
#endif
for (int i=1;i<=n;i++) f[i]=i;
std::stable_sort(f+1,f+n+1,cmp);
// for (int i=1;i<=n;i++) printf("%d ",f[i]);puts("");
int lst=n;
for (int k=n;k>=1;k--)
{
if (lst>=k) --lst;
while (lst>0) if (ask2(1,lst,k)) --lst;else break;
p[k]=lst+1;
}
for (int k=n-1;k>=1;k--) p[k]=std::min(p[k],p[k+1]);
// for (int k=1;k<=n;k++) printf("%d ",p[k]);puts("");
for (int i=1;i<=n;i++) for (int k=p[i];k<=n;k++) g[f[i]][f[k]]=1;
print();
for (int i=1;i<=n;i++) f[i]=p[i]=0;
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) g[i][j]=0;
#ifdef wzf
interactor::clear();
#endif
}
return 0;
}