代码求调
查看原帖
代码求调
189410
dxbt楼主2023/10/31 11:18

本人在本地上测是过的,可是交上去却 Wa#1

#include<bits/stdc++.h>
#define F(i,l,r) for(int i=l,i##end=r;i<=i##end;++i)
#define G(i,l,r) for(int i=l,i##end=r;i>=i##end;--i)
#define x first
#define y second
#define pii pair<int,int>
#define mp(x,y) make_pair(x,y)
#define ep emplace_back
#define lowbit(x) (x&-x)
template<typename T>inline void readmain(T &n){T sum=0,x=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')x=-1;ch=getchar();}while(isdigit(ch)){sum=sum*10+ch-'0';ch=getchar();}n=sum*x;}
template<typename T>inline T& read(T &x){readmain(x);return x;}
template<typename T,typename ...Tr>inline void read(T &x,Tr&... r){readmain(x);read(r...);}
using namespace std;
int ma[20000];int cnt=0;
bool ask(int x,int y,int z)
{
	printf("? %d %d %d\n",x,y,z);
	cnt++;
	fflush(stdout);
	int xx;
	cin>>xx;
	return xx;
}
int ans[20000];
void solve()
{
	int n;
	fflush(stdout);
	cin>>n;cnt=0;
	F(i,1,n) ma[i]=-1;
	F(i,1,n/3)ma[i*3-2]=ask(i*3-2,i*3-1,i*3);
	int _0=-1,_1=-1;
	F(i,1,n) ans[i]=-1;
	F(i,1,n/3-1)
	{
		if(_1!=-1 && _0!=-1) break;
		if(ma[i*3-2]^ma[i*3+1])
		{
			int a=i*3-2;
			int b=a+1,c=a+2,d=a+3,e=a+4,f=a+5;
			if(ma[a])
			{
				if(!ask(b,c,d)){_1=a;_0=b;goto sk;}
				if(!ask(b,c,e)){_1=a;_0=e;goto sk;}
				if(!ask(b,c,f)){_1=a;_0=f;goto sk;}
				_1=b;
				if(ask(_1,d,e)){_0=f;goto sk;}
				if(ask(_1,e,f)){_0=d;goto sk;}
				if(ask(_1,d,f)){_0=e;goto sk;}
				_0=e;
			}
			else
			{
				if(ask(b,c,d)){_0=a;_1=b;goto sk;}
				if(ask(b,c,e)){_0=a;_1=e;goto sk;}
				if(ask(b,c,f)){_0=a;_1=f;goto sk;}
				_0=b;
				if(!ask(_0,d,e)){_1=f;goto sk;}
				if(!ask(_0,e,f)){_1=d;goto sk;}
				if(!ask(_0,d,f)){_1=e;goto sk;}
				_1=e;
			}
			sk: 
			ans[_0]=0;
			ans[_1]=1;
			if(a!=_0 && a!=_1) ans[a]=ask(_0,_1,a);
			if(f!=_0 && f!=_1) ans[f]=ask(_0,_1,f);
			if(e!=_0 && e!=_1) ans[e]=ask(_0,_1,e);
			if(d!=_0 && d!=_1) ans[d]=ask(_0,_1,d);
			if(c!=_0 && c!=_1) ans[c]=ask(_0,_1,c);
			if(b!=_0 && b!=_1) ans[b]=ask(_0,_1,b);
			break;
		}
	}
	F(i,1,n/3)
	{
		if(ans[i*3-2]==-1 && ans[i*3-1]==-1 && ans[i*3]==-1)
		{
			int a=i*3-2,b=i*3-1,c=i*3;
			if(ma[a])
			{
				if(ask(_0,a,b)){ans[a]=1;ans[b]=1;ans[c]=ask(_0,_1,c);	} 	
				else{ans[c]=1;ans[a]=ask(a,_0,_1);ans[b]=1^ans[a];}
			} 
			else
			{
				if(!ask(_1,a,b)){ans[a]=0;ans[b]=0;ans[c]=ask(_0,_1,c);	} 	
				else{ans[c]=0;ans[a]=ask(a,_0,_1);ans[b]=1^ans[a];}
			}
		}
	}
	cnt=0;
	F(i,1,n) if(ans[i]==0) cnt++;
	printf("! %d ",cnt);
	F(i,1,n) if(ans[i]==0)cout<<i<<" ";
	cout<<endl;
	fflush(stdout);
}
signed main(){
	int T;
	read(T);
	while(T--)solve();
	return 0;
}

2023/10/31 11:18
加载中...