CF1174F

https://dudulu.net/blog/?p=1696

#include<bits/stdc++.h>
using namespace std;
#define fp(i,l,r) for(register int (i)=(l);i<=(r);++(i))
#define fd(i,l,r) for(register int (i)=(l);i>=(r);--(i))
#define fe(i,u) for(register int (i)=front[(u)];(i);(i)=e[(i)].next)
#define mem(a) memset((a),0,sizeof (a)) 
#define O(x) cerr<<#x<<':'<<x<<endl
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
	return x*f;
}
void wr(int x){
	if(x<0)x=-x,putchar('-');
	if(x>=10)wr(x/10);
	putchar('0'+x%10);
}
const int MAXN=200010;
vector<int>G[MAXN],buc;
int sze[MAXN],hson[MAXN],dep[MAXN],depx,n;
void dfs1(int u,int f){
	sze[u]=1;
	for(auto v:G[u])if(v!=f){
			dep[v]=dep[u]+1;dfs1(v,u);sze[u]+=sze[v];
			if(sze[v]>sze[hson[u]])hson[u]=v;
	}
}
void dfs2(int u){
	int t=u;buc.clear();
	while(t)buc.push_back(t),t=hson[t];
	printf("d %d
",buc.back());fflush(stdout);
	int dis=read(),depy=(dep[buc.back()]+depx-dis)/2;
	int y=buc[depy-dep[u]];
	if(depy==depx){
		printf("! %d
",y);return;
	}
	printf("s %d
",y);fflush(stdout);dfs2(read());
}
main(){
	n=read();
	fp(i,1,n-1){
		int x=read(),y=read();G[x].push_back(y);G[y].push_back(x);
	}
	puts("d 1");fflush(stdout);depx=read();
	if(!depx){puts("! 1");return 0;}
	dfs1(1,0);dfs2(1);
	return 0;
}

原文地址:https://www.cnblogs.com/misaka10047/p/13228170.html