求助
查看原帖
求助
36957
RainFestival楼主2022/10/13 11:06

就是第二篇题解的做法。

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

https://codeforces.com/contest/1514/submission/175823077

2022/10/13 11:06
加载中...