第100个点TLE求助
查看原帖
第100个点TLE求助
429403
c202201楼主2022/7/21 15:42

求大佬帮忙优化


#include <cstdio>
#include <ctype.h>
#define il inline
#define ri register int
using namespace std;
const int N=2e5+5;
int to[N<<1],nxt[N<<1],h[N],cnt;
int n,dep[N],mxd[N],depx,deplca,fa[N][20],now;
il int read(){
	int x(0);
	char ch(getchar());
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch)){
		x=(x<<3)+(x<<1)+(ch&15);
		ch=getchar();
	}
	return x;
}
il void add(int u,int v){
	to[++cnt]=v,nxt[cnt]=h[u],h[u]=cnt;
}
il void dfs(int u,int f){
	dep[u]=dep[f]+1;
	fa[u][0]=f,mxd[u]=u;
	for(ri i=1;i<=18;++i) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(ri i=h[u];i;i=nxt[i]){
		int v=to[i];
		if(v!=f){
			dfs(v,u);
			if(dep[mxd[u]]<dep[mxd[v]]) mxd[u]=mxd[v];
		}
	}
}
int main(){
	n=read();
	for(ri i=1,u,v;i<n;++i){
		u=read(),v=read();
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	printf("d 1\n");
	fflush(stdout);
	depx=read();
	if(!depx) return printf("! 1"),0;
	++depx,now=1;
	while(1){
		printf("d %d\n",mxd[now]);
		fflush(stdout);
		deplca=read();
		if(deplca==0) return printf("! %d",mxd[now]),0;
		deplca=(depx+dep[mxd[now]]-deplca)/2;
		int u=mxd[now];
		for(ri i=18;i>=0;--i) if(dep[fa[u][i]]>=deplca) u=fa[u][i];
		if(dep[u]==depx) return printf("! %d",u),0;
		printf("s %d\n",u);
		fflush(stdout);
		now=read();
		if(dep[now]==depx) return printf("! %d",now),0;
	}
	return 0;
}

2022/7/21 15:42
加载中...