题目链接:https://codeforces.com/contest/1174/problem/F
参考题解:https://dudulu.net/blog/?p=1696
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define mp make_pair
#define pii pair<int,int>
using namespace std;
const int N = 1e6+1000;
bool vis[N];
int deep[N],id[N],siz[N],son[N],disx;
vector<int>nxt[N];
void dfs(int u,int f) {
deep[u] = deep[f]+1; //深度
son[u] = 0; //重儿子
siz[u] = 1;
for(auto v:nxt[u]) {
if(v==f)continue;
dfs(v,u);
siz[u] += siz[v];
if(siz[son[u]]<siz[v]) son[u] = v; //维护重儿子
}
}
int low[N];
void dfs2(int u,int f) {
if(son[u]) {
dfs2(son[u],u);
low[u] = low[son[u]];
}
else low[u] = u;
for(auto v:nxt[u]) {
if(v==f||v==son[u]) continue;
dfs2(v,u);
}
}
int n;
int go(int u,int x) {
rep(i, 1, x) u = son[u];
return u;
}
void solve(int u) {
if(u==1) {
cout<<"d 1"<<endl;
fflush(stdout);
cin>>disx;
}
int ux = disx-deep[u];
int v = low[u];
int uv = deep[v]-deep[u];
cout<<"d "<<v<<endl;
fflush(stdout);
int vx;
cin>>vx;
int dy = (ux+uv-vx)/2;
int y = go(u,dy);
int uy = deep[y]-deep[u];
int yx = ux-uy;
if(yx==0) {
cout<<"! "<<y<<endl;
fflush(stdout);
exit(0);
}
cout<<"s "<<y<<endl;
fflush(stdout);
cin>>u;
solve(u);
}
int main() {
//freopen("a.txt","r",stdin);
ios::sync_with_stdio(0);
cin>>n;
rep(i, 1, n-1) {
int u, v;
cin>>u>>v;
nxt[u].pb(v);
nxt[v].pb(u);
}
deep[0] = -1;
dfs(1,0);
dfs2(1,0);
solve(1);
return 0;
}