QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#777927 | #9570. Binary Tree | Evan | RE | 0ms | 0kb | C++23 | 4.2kb | 2024-11-24 11:20:08 | 2024-11-24 11:20:09 |
answer
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int ask(int u,int v)
{
printf("? %d %d\n",u,v);
fflush(stdout);
int res;
scanf("%d",&res);
return res;
}
void guess(int x)
{
printf("! %d\n",x);
fflush(stdout);
}
void solve()
{
int n,u,v,ans=1,N;
scanf("%d",&N);
vector<vector<int>> s(n+10);
for(int i=1;i<=N;i++)
{
scanf("%d %d",&u,&v);
if(u)
{
s[u].push_back(i);
s[i].push_back(u);
}
if(v)
{
s[v].push_back(i);
s[i].push_back(v);
}
}
int minl = inf;
vector<int> sz(N + 10);
vector<int> dp(N + 10);
function<void(int, int)> dfs = [&](int u, int fa) {
sz[u] = 1;
for (int v : s[u]) {
if (v != fa) {
dfs(v, u);
sz[u] += sz[v];
dp[u] = max(dp[u], sz[v]);
}
}
dp[u] = max(dp[u], n - sz[u]);
if (minl > dp[u]) {
minl = dp[u];
ans = u;
}
};
function<void(int,int)> dfs0 = [&](int x,int fa) {
n++;
for(int v:s[x]){
if(v!=fa){
dfs0(v,x);
}
}
};
while(1)
{
minl=inf;
for(int i=1;i<=N;i++){dp[i]=0;sz[i]=0;}
n=0;
dfs0(ans,0);
dfs(ans,0);
int r=s[ans].size();
if(r==0)
{
guess(ans);
return;
}
else if(r==1)
{
int res=ask(ans,s[ans][0]);
if(res==0)
{
guess(ans);
}
else if(res==2)
{
guess(s[ans][0]);
}
return;
}
else if(r==2)
{
int res=ask(s[ans][0],s[ans][1]);
if(res==1)
{
guess(ans);return;
}
else if(res==0)
{
int tmp=ans;
ans=s[ans][0];
int i;
for(i=0;i<s[ans].size();i++)
{
if(s[ans][i]==tmp){break;}
}
s[ans].erase(s[ans].begin()+i,s[ans].begin()+1+i);
}
else if(res==2)
{
int tmp=ans;
ans=s[ans][1];
int i;
for(i=0;i<s[ans].size();i++)
{
if(s[ans][i]==tmp){break;}
}
s[ans].erase(s[ans].begin()+i,s[ans].begin()+1+i);
}
}
else if(r==3)
{
vector<pair<int,int>> o;
for(int x:s[ans]){
o.push_back({sz[x],x});
}
sort(o.begin(),o.end());
int res=ask(o[1].second,o[2].second);
if(res==0)
{
int tmp=ans;
ans=o[1].second;
int i;
for(i=0;i<s[ans].size();i++)
{
if(s[ans][i]==tmp){break;}
}
s[ans].erase(s[ans].begin()+i,s[ans].begin()+1+i);
}
else if(res==2)
{
int tmp=ans;
ans=o[2].second;
int i;
for(i=0;i<s[ans].size();i++)
{
if(s[ans][i]==tmp){break;}
}
s[ans].erase(s[ans].begin()+i,s[ans].begin()+1+i);
}
else if(res==1)
{
int i;
for(i=0;i<s[ans].size();i++)
{
if(s[ans][i]==o[1].second){break;}
}
s[ans].erase(s[ans].begin()+i,s[ans].begin()+1+i);
for(i=0;i<s[ans].size();i++)
{
if(s[ans][i]==o[2].second){break;}
}
s[ans].erase(s[ans].begin()+i,s[ans].begin()+1+i);
}
}
}
}
signed main()
{
int tt;
scanf("%d",&tt);
while(tt--)
{
solve();
}
}
详细
Test #1:
score: 0
Runtime Error
input:
2 5 0 0 1 5 2 4 0 0 0 0