QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#776614#9570. Binary TreeWaO_oRE 1ms5636kbC++203.6kb2024-11-23 19:42:562024-11-23 19:42:57

Judging History

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

  • [2024-11-23 19:42:57]
  • 评测
  • 测评结果:RE
  • 用时:1ms
  • 内存:5636kb
  • [2024-11-23 19:42:56]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define deg( x ) cout<<""#x"="<<x<<endl
//#define endl '\n'
#define pll pair<int,int>
#define fr first
#define se second

const int N=1e5+10;

vector<int> G[ N ];
map< int , int > mp;

void init( int n ){
    for( int i=1; i<=n; i++ ){
        G[ i ].clear();
    }
    mp.clear();
}

bool is( int u , int v ){
    if( u > v ) swap( u , v );
    return mp[ ( u<<25ll )|v ]==1;
}

void del( int u , int v ){
    if( u > v ) swap( u , v );
    mp[ ( u<<25ll )|v ]=1;
}

int bt , sz;

int V[ N ];

int ma=0;

int dfs( int rt , int fa ){
    int sum=0;
    int re=0;
    for( auto son:G[ rt ] ){
        if( son==fa || is( rt , son ) ) continue;
        int te=dfs( son , rt );
        sum+=te;
        re=max( te , re );
    }

    re=max( re , sz-sum-1 );

    V[ rt ]=sum+1;

    if( ma > re ){
        ma=re;
        bt=rt;
    }

    return sum+1;
}

int wen( int a , int b ){
    cout<<"? "<<a<<" "<<b<<endl;

    int re;
    cin>>re;

    return re;
}

pll A[ N ];

void solve(){
    int n;
    cin>>n;

    init( n );

    for( int i=1,u,v; i<=n; i++ ){
        cin>>u>>v;
        if( u!=0 ){
            G[ i ].emplace_back( u );
            G[ u ].emplace_back( i );
        }
        swap( u  ,v );
        if( u!=0 ){
            G[ i ].emplace_back( u );
            G[ u ].emplace_back( i );
        }
    }

    sz=n;
    int st=1;
    while( 1 ){
        ma=sz;
        dfs( st , 0 );

        if( sz == 1 ){
            cout<<"! "<<st<<endl;
            break;
        }

        dfs( bt , 0 );

//        for( int i=1; i<=n; i++ ){
//            cout<<V[ i ]<<" ";
//        }
//        cout<<endl;

        int cnt=0;
        for( auto son:G[ bt ] ){
            if( is( son , bt ) ) continue;
            cnt++;
            A[ cnt ]={ V[ son ] , son };
        }

        sort( A+1 , A+1+cnt );

        if( cnt == 3 ){
            int re=wen( A[ 3 ].se , A[ 2 ].se );
            if( re==0 ){
                del( bt , A[ 1 ].se );
                del( bt , A[ 2 ].se );
                sz-=V[ A[ 1 ].se ];
                sz-=V[ A[ 3 ].se ];
                st=A[ 3 ].se;
            }
            else if( re==1 ){
                del( bt , A[ 3 ].se );
                del( bt , A[ 2 ].se );
                sz-=V[ A[ 3 ].se ];
                sz-=V[ A[ 2 ].se ];
                st=bt;
            }
            else{
                del( bt , A[ 1 ].se );
                del( bt , A[ 3 ].se );
                sz-=V[ A[ 1 ].se ];
                sz-=V[ A[ 3 ].se ];
                st=A[ 2 ].se;
            }
        }
        else if( cnt==2 ){
            int re=wen( A[ 1 ].se , A[ 2 ].se );

            if( re==0 ){
                del( bt , A[ 2 ].se );
                sz-=V[ A[ 2 ].se ];
                st=A[ 1 ].se;
            }
            else if( re==1 ){
                cout<<"! "<<bt<<endl;
                break;
            }
            else{
                del( bt , A[ 1 ].se );
                sz-=V[ A[ 1 ].se ];
                st=A[ 2 ].se;
            }
        }
        else{
            int re=wen( bt , A[ 1 ].se );
            if( re==0 ){
                cout<<"! "<<bt<<endl;
                break;
            }
            else{
                cout<<"! "<<A[ 1 ].se<<endl;
                break;
            }
        }
    }

}

signed main() {
    ios::sync_with_stdio( 0 );
    cin.tie( 0 ); cout.tie( 0 );

    int T=1;
    cin>>T;

    while( T-- ){
        solve();
    }

    return 0;
}

详细

Test #1:

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

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
Runtime Error

input:

5555
8
2 0
8 6
0 0
3 0
0 0
7 0
0 0
5 4
0
2
0
8
0 0
1 4
2 0
0 0
7 8
0 0
3 0
6 0
2
1
2
8
5 8
0 0
1 7
0 0
0 0
4 2
0 0
6 0
2
0
2

output:

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

result: