QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#777927#9570. Binary TreeEvanRE 0ms0kbC++234.2kb2024-11-24 11:20:082024-11-24 11:20:09

Judging History

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

  • [2024-11-24 11:20:09]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-11-24 11:20:08]
  • 提交

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

output:


result: