QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#776626 | #9570. Binary Tree | WaO_o | RE | 2ms | 7728kb | C++20 | 3.6kb | 2024-11-23 19:46:00 | 2024-11-23 19:46:00 |
Judging History
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=3e5+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;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 7728kb
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