码风良好,WA on #5 求助
查看原帖
码风良好,WA on #5 求助
363036
chlchl楼主2024/8/3 15:50
#include<bits/stdc++.h>
using namespace std;

const int N = 2000 + 10;
int T, n, vis[N];
int g[N][N];
int tp, sta[N];
char okokok[N];
vector<int> path;

bool find_path(int u, int fa){
	if(vis[u]){
		path.clear();
		if(u <= n)
			path.push_back(u);
		while(sta[tp] != u)
			path.push_back(sta[tp--]);
		if(u > n)
			path.push_back(u);
		tp = 0;
		return 1;
	}
	vis[u] = 1;
	sta[++tp] = u;
	for(int v=1;v<=n*2;v++){
		if(v == fa || !g[u][v] || vis[v] == 2)
			continue;
		if(find_path(v, u))
			return 1;
	}
	tp--;
	vis[u] = 2;
	return 0;
}

void solve(){
	memset(g, 0, sizeof(g));
	memset(vis, 0, sizeof(vis));
	memset(sta, 0, sizeof(sta));
	tp = 0; 
	scanf("%d", &n);
	for(int i=1,x,y;i<=2*n;i++){
		scanf("%d%d", &x, &y);
		g[x][y + n] = g[y + n][x] = i;
	}
	for(int i=1;i<=n;i++)
		if(!vis[i] && find_path(i, i))
			break;
	while(path.size() > 4){
		int color, sz = path.size();
		int s = 0, t = (sz % 4 ? sz / 2 : sz / 2 + 1);
		int u = path[s], v = path[t], flag = 1;
		if(u > v)
			swap(u, v);//先行后列 
		printf("? %d %d\n", u, v - n);
		fflush(stdout);
		scanf("%d", &color);
		g[u][v - n] = g[v - n][u] = color;
		vector<int> now;
		for(int i=s;i<t;i++){
			if(g[path[i]][path[i + 1]] == color){
				flag = 0;
				break;
			}
		}
		if(flag){
			for(int i=s;i<=t;i++)
				now.push_back(path[i]);
		}else{
			now.push_back(path[s]);
			for(int i=path.size()-1;i>=t;i--)
				now.push_back(path[i]);
		}
		swap(path, now);
//		for(int i=0;i<path.size();i++)
//			cout << path[i] << ' ';
	}
	sort(path.begin(), path.end());
	printf("! %d %d %d %d\n", path[0], path[1], path[2] - n, path[3] - n);
	fflush(stdout);
	scanf("%s", okokok);
	return ;
}

int main(){
	scanf("%d", &T);
	while(T--)
		solve();
	return 0;
}
2024/8/3 15:50
加载中...