QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#818422 | #9570. Binary Tree | lixp | TL | 1ms | 3764kb | C++17 | 2.0kb | 2024-12-17 20:11:03 | 2024-12-17 20:11:04 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int fir[N],ne[N<<1],to[N<<1],cnt;
int n,vis[N],dis[N],d[2][N];
void add(int x,int y) {
ne[++cnt]=fir[x];
fir[x]=cnt;
to[cnt]=y;
}
void dfs(int x,int fa) {
for(int i=fir[x];i;i=ne[i]) {
int y=to[i];
if(y==fa || vis[y]) continue;
dis[y]=dis[x]+1; dfs(y,x);
}
}
bool getlen(int &p,int &q) {
int rt=0;
p=q=0;
for(int i=1;i<=n;i++) if(!vis[i]) p=i;
for(int i=1;i<=n;i++) dis[i]=0; dfs(p,0); q=p;
for(int i=1;i<=n;i++) if(!vis[i] && dis[i]>dis[q]) q=i;
for(int i=1;i<=n;i++) dis[i]=0; dfs(q,0); p=q;
for(int i=1;i<=n;i++) if(!vis[i] && dis[i]>dis[p]) p=i;
if(p==q) {
cout<<"! "<<p<<"\n"; fflush(stdout);
return false;
}
return true;
}
void Dfs(int x,int fa,int *f) {
for(int i=fir[x];i;i=ne[i]) {
int y=to[i];
if(vis[y] || y==fa) continue;
f[y]=f[x]+1; Dfs(y,x,f);
}
}
void solve() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
int x,y;scanf("%d%d",&x,&y);
if(x) add(i,x),add(x,i);
if(y) add(i,y),add(y,i);
}
int p,q;
int tms=0;
while(getlen(p,q)) {
Dfs(p,0,d[0]); Dfs(q,0,d[1]);
cout<<"? "<<p<<" "<<q<<"\n"; fflush(stdout);
tms++;
if((1<<tms)>n) while(1);
int t;scanf("%d",&t);
for(int i=1;i<=n;i++) {
if(vis[i]) continue;
if(t==0) {
if(d[0][i]>=d[1][i]) vis[i]=1;
} else if(t==1) {
if(d[0][i]!=d[1][i]) vis[i]=1;
} else if(t==2) {
if(d[0][i]<=d[1][i]) vis[i]=1;
}
}
for(int i=1;i<=n;i++) d[0][i]=d[1][i]=0;
}
}
void init() {
for(int i=1;i<=n;i++) fir[i]=0; cnt=0;
for(int i=1;i<=n;i++) vis[i]=0;
}
int main() {
int T;scanf("%d",&T);
while(T--) {
init(); solve();
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3764kb
input:
2 5 0 0 1 5 2 4 0 0 0 0 0 1 2 0 2 0 0 2
output:
? 1 4 ? 5 1 ! 2 ? 2 1 ! 1
result:
ok OK (2 test cases)
Test #2:
score: -100
Time Limit Exceeded
input:
5555 8 2 0 8 6 0 0 3 0 0 0 7 0 0 0 5 4 2 0 2 8 0 0 1 4 2 0 0 0 7 8 0 0 3 0 6 0 2 1 0 8 5 8 0 0 1 7 0 0 0 0 4 2 0 0 6 0 2 0 0 5 4 5 3 1 0 0 0 0 0 0 0 0 8 0 0 0 0 5 6 0 0 1 4 2 0 3 8 0 0 2 0 5 3 0 5 1 0 0 0 0 4 0 2 2 5 5 0 0 0 0 0 3 0 2 4 0 2 3 3 0 1 0 0 0 2 2 2 0 0 0 2 3 2 3 0 0 0 0 0 10 2 8 9 7 0 0 ...
output:
? 3 7 ? 7 1 ? 7 6 ! 6 ? 6 1 ? 3 1 ? 4 2 ! 4 ? 2 7 ? 7 5 ? 7 3 ! 7 ? 4 3 ? 5 4 ! 5 ? 2 1 ? 4 1 ! 4 ? 4 3 ? 3 1 ! 1 ? 1 3 ? 2 1 ! 1 ? 3 2 ! 2 ? 2 1 ! 1 ? 3 2 ! 3 ? 8 3 ? 10 8 ? 8 1 ! 8 ? 2 1 ! 2 ? 6 4 ? 5 4 ? 8 3 ! 3 ? 2 9 ? 9 1 ? 5 1 ! 1 ? 1 5 ? 4 5 ? 6 5 ! 3 ? 2 1 ! 2 ? 1 2 ? 7 1 ! 7 ? 1 3 ? 1 7 ? 7...