QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#755601#9570. Binary TreeqiuuuML 2ms6236kbC++171.9kb2024-11-16 17:44:052024-11-16 17:44:06

Judging History

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

  • [2024-11-16 17:44:06]
  • 评测
  • 测评结果:ML
  • 用时:2ms
  • 内存:6236kb
  • [2024-11-16 17:44:05]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define PB push_back
const int N=100009;
int n,m,t,z1,z2,rt;
int sz[N];
vector<int> edge[N];
void dfs(int x,int fa)
{
	sz[x]=1;
	for(int i:edge[x])
	{
		if(i==fa) continue;
		dfs(i,x);
		sz[x]+=sz[i];
	}
}
void fd(int x,int fa)
{
	bool flg=1;
	for(int i:edge[x])
	{
		if(i==fa) continue;
		fd(i,x);
		if(sz[i]*2>sz[rt]) flg=0; 
	}
	if((sz[rt]-sz[x])*2>sz[rt]) flg=0;
	if(flg)
		if(z1) z2=x;
	else z1=x;
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=N-5;i++) edge[i].clear();
		for(int i=1,x,y;i<=n;i++)
		{
			scanf("%d%d",&x,&y);
			if(x) edge[x].PB(i),edge[i].PB(x);
			if(y) edge[y].PB(i),edge[i].PB(y);
		}
		rt=1;
		while(1)
		{
			dfs(rt,0);
			z1=z2=0;
			fd(rt,0);
			if(sz[rt]==1)
			{
				printf("! %d\n",rt);
				fflush(stdout);
				break;
			}
			if(!z2)
			{
				printf("? %d %d\n",edge[z1].back(),edge[z1].end()[-2]);
				fflush(stdout);
				int x;
				scanf("%d",&x);
				if(x==0)
				{
					x=edge[z1].back();
					edge[z1].clear();
					edge[z1].PB(x);
					edge[x].erase(remove(edge[x].begin(),edge[x].end(),z1),edge[x].end());
					rt=x;
				}
				else if(x==2)
				{
					x=edge[z1].end()[-2];
					edge[z1].clear();
					edge[z1].PB(x);
					edge[x].erase(remove(edge[x].begin(),edge[x].end(),z1),edge[x].end());
					rt=x;
				}
				else
				{
					edge[z1].pop_back();
					edge[z1].pop_back();
					rt=z1;
				}
			}
			else
			{
				printf("? %d %d\n",z1,z2);
				fflush(stdout);
				int x;
				scanf("%d",&x);
				if(x==0) 
				{
					for(auto i=edge[z1].begin();;i++)
					{
						if(*i==z2)
						{
							edge[z1].erase(i);
							break;
						}
					}
					rt=z1;
				}
				else 
				{
					for(auto i=edge[z2].begin();;i++)
					{
						if(*i==z1)
						{
							edge[z2].erase(i);
							break;
						}
					}
					rt=z2;
				}
			}
		}
	}
}

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 6236kb

input:

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

output:

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

result:

ok OK (2 test cases)

Test #2:

score: -100
Memory Limit Exceeded

input:

5555
8
2 0
8 6
0 0
3 0
0 0
7 0
0 0
5 4
2
0
2
8
0 0
1 4
2 0
0 0
7 8
0 0
3 0
6 0
0
2
0
8
5 8
0 0
1 7
0 0
0 0
4 2
0 0
6 0
0
1
0
5
4 5
3 1
0 0
0 0
0 0
0
2
8
0 0
0 0
5 6
0 0
1 4
2 0
3 8
0 0
1
1
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
2
3
2 3
0 0
0 0
1
10
2 8
9 7
0 ...

output:

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

result: