萌新求助lca板子
查看原帖
萌新求助lca板子
324666
diqiuyi奶龙楼主2023/2/25 12:41

rt,WA 掉了

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return f*x;
}
int t,n,u,v,w,dep[10005],lg[10005],sum[10005],f[10005][15],lc;
struct edge{
	int v,w;
};
vector<edge> g[10005];
void dfs(int x,int fa){
	f[x][0]=fa,dep[x]=dep[fa]+1;
	for(int i=1;i<=lg[dep[x]];i++) 
		f[x][i]=f[f[x][i-1]][i-1];
	for(int i=0;i<g[x].size();i++)
		if(g[x][i].v^fa)
			sum[g[x][i].v]=sum[x]+g[x][i].w,dfs(g[x][i].v,x);
}
inline int lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	while(dep[u]<dep[v]) u=f[u][lg[dep[u]-dep[v]]];
	if(u==v) return u;
	for(int i=lg[dep[u]];~i;i--)
		if(f[u][i]^f[v][i])
			u=f[u][i],v=f[v][i];
	return f[u][0];
}
string s;
inline int query(int x,int y){
	for(int i=0;i<=lg[y];i++)
		if(y&(1<<i))
			x=f[x][i];
	return x;
}
signed main(){
	t=read();
	for(int i=1;i<=10000;i++)
		lg[i]=lg[i-1]+(i==(1<<lg[i-1]+1));
	while(t--){
		n=read();
		for(int i=1;i<n;i++)
			u=read(),v=read(),w=read(),g[u].push_back((edge){v,w}),g[v].push_back((edge){u,w});
		dfs(1,0);
		while(cin>>s){
			if(s=="DONE") break;
			if(s=="DIST")
				u=read(),v=read(),lc=lca(u,v),printf("%lld\n",sum[u]+sum[v]-(sum[lc]<<1));
			else{
				u=read(),v=read(),w=read(),lc=lca(u,v);
				if(dep[u]-dep[lc]+1>=w) printf("%lld\n",query(u,w-1));
				else printf("%lld\n",query(v,dep[u]+dep[v]-(dep[lc]<<1)-w+1));
			}
		}
		for(int i=1;i<=n;i++) g[i].clear();
		memset(dep,0,sizeof dep),memset(f,0,sizeof f),memset(sum,0,sizeof sum);
	}
	return 0;
}
2023/2/25 12:41
加载中...