QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#727793 | #9570. Binary Tree | ucup-team4938# | TL | 0ms | 0kb | C++14 | 2.6kb | 2024-11-09 13:50:23 | 2024-11-09 13:50:23 |
answer
#include<bits/stdc++.h>
#define int long long
#define mod 998244353ll
#define pii pair<int,int>
#define fi first
#define se second
#define mems(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define db double
using namespace std;
const int maxn=200010;
const int inf=1e18;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
return x*f;
}
bool Mbe;
int n;
int head[maxn],tot;
struct nd{
int nxt,to;
}e[maxn<<1];
void add(int u,int v){e[++tot]={head[u],v};head[u]=tot;}
int siz[maxn],w[maxn],rt,sum;
bool vis[maxn];
void getrt(int u,int fa){
siz[u]=1,w[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(v==fa||vis[v])continue;
getrt(v,u);
siz[u]+=siz[v],w[u]=max(w[u],siz[v]);
}
w[u]=max(w[u],sum-siz[u]);
if(w[u]<=sum/2)rt=u;
}
void dfs(int u,int fa){
siz[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(v==fa||vis[v])continue;
dfs(v,u);
siz[u]+=siz[v];
}
}
void sovle(int u){
dfs(u,0);
cout<<u<<"\n";
int v1=0,v2=0,v3=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(vis[v])continue;
if(!v1)v1=v;
else if(!v2)v2=v;
else v3=v;
}
if(v3){
printf("? %lld %lld\n",v1,v2);fflush(stdout);
int x=read();
if(x==0){
int v=v1;vis[u]=1;
sum=siz[v];getrt(v,u);sovle(rt);
return ;
}
if(x==1){
vis[v1]=vis[v2]=1;
int v=u;sum=siz[v3]+1;
getrt(u,v1);sovle(rt);
return ;
}
if(x==2){
int v=v2;vis[u]=1;
sum=siz[v];getrt(v,u);sovle(rt);
return ;
}
}
if(v2){
printf("? %lld %lld\n",v1,v2);fflush(stdout);
int x=read();
if(x==0){
int v=v1;vis[u]=1;
sum=siz[v];getrt(v,u);sovle(rt);
return ;
}
if(x==1){
printf("! %lld\n",u);fflush(stdout);
return ;
}
if(x==2){
int v=v2;vis[u]=1;
sum=siz[v];getrt(v,u);sovle(rt);
return ;
}
}
if(v1){
printf("? %lld %lld\n",v1,u);fflush(stdout);
int x=read();
if(x==0){
printf("! %lld\n",v1);fflush(stdout);
return ;
}
if(x==2){
printf("! %lld\n",u);fflush(stdout);
return ;
}
}
}
void work(){
n=read();
for(int i=1;i<=n;i++)head[i]=vis[i]=0;tot=0;
for(int i=1;i<=n;i++){
int u=read(),v=read();
if(u)add(i,u),add(u,i);
if(v)add(i,v),add(v,i);
}
sum=n;getrt(1,0);
sovle(rt);
}
// \
444
bool Med;
int T;
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
// cerr<<(&Mbe-&Med)/1048576.0<<" MB\n";
T=read();
while(T--)work();
}
详细
Test #1:
score: 0
Time Limit Exceeded
input:
2 5 0 0 1 5 2 4 0 0 0 0
output:
2 ? 3 5