QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#749111#9570. Binary Treeucup-team3294#RE 1ms3604kbC++232.6kb2024-11-14 22:41:522024-11-14 22:41:53

Judging History

你现在查看的是最新测评结果

  • [2024-11-14 22:41:53]
  • 评测
  • 测评结果:RE
  • 用时:1ms
  • 内存:3604kb
  • [2024-11-14 22:41:52]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
#define PII pair<int,int>
void solve()
{
	int n;
	cin>>n;
	vector<int> G[n+10],G1[n+10];
	for(int i=1;i<=n;i++){
		int l,r;
		cin>>l>>r;
		if(l) G[i].push_back(l),G[l].push_back(i);
		if(r) G[i].push_back(r),G[r].push_back(i);
	}
	int GG=0;
	auto ask=[&](int u,int v)->int{
		GG++;
		if((1LL<<GG)>n){
			return -1;
		}
		cout<<"? "<<u<<" "<<v<<endl;
		int x;
		cin>>x;
		return x;
	};
	auto print=[&](int x){
		cout<<"! "<<x<<endl;
		return;
	};
	int root=1;
	int zx,zt,m=n,k;
	vector<int> siz(n+1);
	function<void(int,int)> dfs=[&](int u,int fa){
		siz[u]=1;
		int Max=0;
		for(auto v:G[u]){
			if(v==fa) continue;
			dfs(v,u);
			siz[u]+=siz[v];
			Max=max(Max,siz[v]);
		}
		Max=max(Max,m-siz[u]);
		if(Max<zt){
			zt=Max;
			zx=u;
		}
	};
	auto find=[&](){
		zx=zt=1e18;
		dfs(root,0);
		root=zx;
	};
	function<void(int,int)> dfs1=[&](int u,int fa){
		k++;
		for(auto v:G[u]){
			if(v==fa) continue;
			G1[u].push_back(v);
			G1[v].push_back(u);
			dfs1(v,u);
		}
	};
	auto Get=[&](int x,int y){
		k=0;
		for(int i=1;i<=n;i++) G1[i].clear();
		dfs1(x,y);
		m=k;
		for(int i=1;i<=n;i++) G[i].clear();
		for(int i=1;i<=n;i++) G[i]=G1[i];
//		for(int i=1;i<=n;i++){
//			for(auto x:G[i]){
//				cout<<i<<" "<<x<<endl;
//			}
//		}
	};
	int pp=0;
	while(1){
		find();
//		cout<<root<<"11111111"<<endl;
//	    pp++;
//		if(pp==3) break;
		if(G[root].size()==0){
			print(root);
			return;
		}else if(G[root].size()==1){
			int x=ask(root,G[root][0]);
			if(x==0){
				print(root);
				return;
			}else{
				print(G[root][0]);
				return;
			}
		}else if(G[root].size()==2){
			int x=ask(G[root][0],G[root][1]);
			if(x==1){
				print(root);
				return;
			}else if(x==0){//G[root][0]
				int p=G[root][0];
				Get(G[root][0],root);
				root=p;
			}else{//G[root][1]
				int p=G[root][1];
				Get(G[root][1],root);
				root=p;
			}
		}else if(G[root].size()==3){
			int x=ask(G[root][0],G[root][1]);
			if(x==1){//G[root][2]
				int p1=root,p2=G[root][2];
				Get(G[root][2],root);
				G[p1].push_back(p2);
				G[p2].push_back(p1);m++;
			}else if(x==0){//G[root][0]
				int p=G[root][0];
				Get(G[root][0],root);
				root=p;
			}else{//G[root][1]
				int p=G[root][1];
				Get(G[root][1],root);
				root=p;
			}
		}
	}
}
/*
1
12
0 0
1 5
2 4
0 11
6 7
9 10
8 0
0 0
0 0
0 0
0 12
0 0
*/
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T=1;
	cin>>T;
	while(T--)
	{
		solve();
	}
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3604kb

input:

2
5
0 0
1 5
2 4
0 0
0 0
1
1
2
0 2
0 0
2

output:

? 1 5
? 4 2
! 3
? 2 1
! 1

result:

ok OK (2 test cases)

Test #2:

score: -100
Runtime Error

input:

5555
8
2 0
8 6
0 0
3 0
0 0
7 0
0 0
5 4
0
0
2
8
0 0
1 4
2 0
0 0
7 8
0 0
3 0
6 0
2
1
0
8
5 8
0 0
1 7
0 0
0 0
4 2
0 0
6 0
0
0
2
5
4 5
3 1
0 0
0 0
0 0
1
2
8
0 0
0 0
5 6
0 0
1 4
2 0
3 8
0 0
0
0
5
3 0
5 1
0 0
0 0
4 0
0
2
5
5 0
0 0
0 0
3 0
2 4
1
0
3
3 0
1 0
0 0
2
2
2 0
0 0
0
3
2 3
0 0
0 0
2
10
2 8
9 7
0 0
...

output:

? 2 5
? 2 7
? 1 2
! 2
? 5 3
? 3 1
? 4 2
! 4
? 1 6
? 1 7
? 5 1
! 1
? 4 5
? 3 1
! 1
? 5 6
? 1 4
! 1
? 5 1
? 4 5
! 5
? 1 2
? 3 5
! 3
? 3 2
! 2
? 2 1
! 2
? 2 3
! 3
? 2 6
? 1 9
? 10 9
! 9
? 2 1
! 2
? 5 9
? 5 4
? 8 3
! 8
? 5 8
? 5 7
? 9 7
! 9
? 3 4
? 9 1
? 8 9
! 9
? 2 1
! 1
? 4 3
? 1 7
! 7
? 4 9
? 2 3
? 4...

result: