QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#775399#9570. Binary TreeWaO_oML 2ms7716kbC++206.8kb2024-11-23 15:45:222024-11-23 15:45:22

Judging History

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

  • [2024-11-23 15:45:22]
  • 评测
  • 测评结果:ML
  • 用时:2ms
  • 内存:7716kb
  • [2024-11-23 15:45:22]
  • 提交

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 ];
int faa[ N ];
map< int , int > mp;

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

int len=0;
int bt;

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;
}

void dfs( int rt , int fa , int now ){
    faa[ rt ]=fa;
    if( now > len ){
        len=now;
        bt=rt;
    }
    for( auto son:G[ rt ] ){
        if( son==fa || is( rt , son ) ) continue;

        dfs( son , rt , now+1 );
    }
}

int get( int a , int b ){
    cout<<"? "<<a<<" "<<b<<endl;
    int re;
    cin>>re;

    if( re==0 ){
        int num=len+1;
        num/=2;

        int o=b;
        for( int i=1; i<num; i++ ){
            o=faa[ o ];
        }
        del( o , faa[ o ] );

        return a;
    }
    else if( re==1 ){
        int num=len/2;

        int o=b;
        for( int i=1; i<num; i++ ){
            o=faa[ o ];
        }

        del( o , faa[ o ] );
        o=faa[ o ];
        del( o , faa[ o ] );

        return o;
    }
    else{
        int num=len/2;

        int o=b;
        for( int i=1; i<num; i++ ){
            o=faa[ o ];
        }

        //cout<<o<<"->"<<faa[ o ]<<endl;

        del( o , faa[ o ] );
        return b;
    }
}

void ddfs( int rt , int fa , int num , int b , int &o ){
    if( rt==b ){
        o=num;
        return ;
    }

    for( auto son:G[ rt ] ){
        if( son==fa || is( son , rt ) ) continue;
        ddfs( son , rt , num+1 , b , o );
    }
}

int hhget( int a , int b , int ans ){
    int aa=-1;
    ddfs( ans , 0 , 0 , a , aa );

    int bb=-1;
    ddfs( ans , 0 , 0 , b , bb );

    if( aa<0 || bb<0 ) cout<<"wfdd"<<endl;

    int re;
    if( aa==bb ) re=1;
    else if( aa < bb ) re=0;
    else re=2;

    if( re==0 ){
        int num=len+1;
        num/=2;

        int o=b;
        for( int i=1; i<num; i++ ){
            o=faa[ o ];
        }
        del( o , faa[ o ] );

        return a;
    }
    else if( re==1 ){
        int num=len/2;

        int o=b;
        for( int i=1; i<num; i++ ){
            o=faa[ o ];
        }

        del( o , faa[ o ] );
        o=faa[ o ];
        del( o , faa[ o ] );

        return o;
    }
    else{
        int num=len/2;

        int o=b;
        for( int i=1; i<num; i++ ){
            o=faa[ o ];
        }

        //cout<<o<<"->"<<faa[ o ]<<endl;

        del( o , faa[ o ] );
        return b;
    }
}

void hh( int n ){
    for( int i=1; i<=n; i++ ){

        mp.clear();

        int ans=i;
        int cnt=0;

        int st=1;
        while( 1 ){
            int a,b;
            len=0;
            dfs( st , 0 , 1 );

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

            a=bt;

            len=0;
            dfs( a , 0 , 1 );
            b=bt;

            cnt++;
            st=hhget( a , b , ans );
        }

        int uu=log2( n );

        if( cnt>uu ){
            cout<<"gg"<<endl;
        }
        else if( ans!=st ){
            cout<<"wa"<<endl;
        }
        else{
            cout<<cnt<<" ac "<<ans<<endl;
        }
    }
}

pll ma[ N ];

void odfs( int rt , int fa ){
    pll te={ -1 , rt };
    for( auto son:G[ rt ] ){
        if( fa==son || is( rt , son ) ) continue;
        odfs( son , rt );
        if( ma[ son ].fr > te.fr ){
            te=ma[ son ];
        }
    }

    ma[ rt ]={ te.fr+1 , te.se };
}

int wen( int a , int b ){
    int re;
    cout<<"? "<<a<<" "<<b<<endl;
    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 );
        }
    }

    //hh( n );

    int st=1;
    while( 1 ){
        int a,b;
        len=0;
        dfs( st , 0 , 1 );

        if( len==1 ){
            cout<<"! "<<st<<endl;
            break;
        }
        a=bt;

        len=0;
        dfs( a , 0 , 1 );
        b=bt;

        int o=b;
        int num=( len+1 )/2;
        for( int i=1; i<num; i++ ){
            o=faa[ o ];
        }

        odfs( o , 0 );

        int cnt=0;
        for( auto son:G[ o ] ){
            if( is( son , o ) ) continue;
            cnt++;
            A[ cnt ]={ ma[ son ].fr , son };
        }

        sort( A+1 , A+1+cnt );
        int re=0;
        if( cnt == 3 ){
            if( A[ 1 ].fr == A[ 2 ].fr ){
                re=wen( ma[ A[ 1 ].se ].se , ma[ A[ 2 ].se ].se );
                if( re == 0 ){
                    del( A[ 2 ].se , o );
                    del( A[ 3 ].se , o );
                }
                else if( re==1 ){
                    del( A[ 2 ].se , o );
                    del( A[ 1 ].se , o );
                }
                else{
                    del( A[ 1 ].se , o );
                    del( A[ 3 ].se , o );
                }
                st=o;
            }
            else if( A[ 2 ].fr == A[ 3 ].fr ){
                re=wen( ma[ A[ 2 ].se ].se , ma[ A[ 3 ].se ].se );
                if( re == 0 ){
                    del( A[ 1 ].se , o );
                    del( A[ 3 ].se , o );
                }
                else if( re==1 ){
                    del( A[ 2 ].se , o );
                    del( A[ 3 ].se , o );
                }
                else{
                    del( A[ 2 ].se , o );
                    del( A[ 1 ].se , o );
                }
                st=o;
            }
            else{
                re=wen( ma[ A[ 3 ].se ].se , ma[ A[ 2 ].se ].se );
                if( re==0 ){
                    st=o;
                    del( o , A[ 2 ].se );
                    del( o , A[ 1 ].se );
                }
                else if( re==2 ){
                    del( A[ 3 ].se , o );
                    a=ma[ A[ 2 ].se ].se;
                    b=ma[ A[ 1 ].se ].se;
                    st=get( a , b );
                }
            }
        }
        else{
            st=get(  a , b );
        }
    }

}

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: 2ms
memory: 7716kb

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

output:

? 3 7
? 7 1
? 1 7
? 6 7

result: