不知到为啥RE了,和ac程序对拍半个小时都找不到差异,求助!!
查看原帖
不知到为啥RE了,和ac程序对拍半个小时都找不到差异,求助!!
111099
加入小鼠楼主2020/11/4 15:17
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,q,cnt,head[10010<<1];
int fa[10010][32],dep[10010];
int lg[10010],t;
ll d[10010];
struct Node{
	int u,to,w;
}Edge[10010<<1];

inline int read(){
	int x=0,k=1;
	char ch=getchar();
	while(ch>'9'||ch<'0'){
		if(ch=='-') k=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*k;
}
inline void add(int x,int y,int z){
	Edge[++cnt].to=y;
	Edge[cnt].u=head[x];
	Edge[cnt].w=z;
	head[x]=cnt;
}
void dfs(int now,int fath){
	dep[now]=dep[fath]+1;
	fa[now][0]=fath;
	for(int i=1;i<=lg[dep[now]];i++)
		fa[now][i]=fa[fa[now][i-1]][i-1];
	for(int i=head[now];i;i=Edge[i].u){
		int to=Edge[i].to;
		if(to!=fath){
	//		cout<<now<<"->"<<to<<endl;
			d[to]=d[now]+Edge[i].w;
			dfs(to,now);	
		}
	}
}
inline int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y])
		x=fa[x][lg[dep[x]-dep[y]]-1];
	if(x==y) return x;
	for(int i=lg[dep[x]]-1;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
void init(){
	memset(Edge,0,sizeof(Edge));
	memset(fa,0,sizeof(fa));
	memset(d,0,sizeof(d));
	memset(dep,0,sizeof(dep));
	memset(head,0,sizeof(head));
}
int main(){
//	freopen("data.txt","r",stdin);
//	freopen("wa.txt","w",stdout);
	t=read();
	for(int i=1;i<=10000;i++)
		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	while(t--){
		init();
		n=read();
		for(int i=1;i<n;i++){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			add(x,y,z);add(y,x,z);
		}
		
		dfs(1,0);
//	for(int i=1;i<=n;i++) cout<<dep[i]<<" ";
		char s[10];
		memset(s,0,sizeof(s));
		while(cin>>s&&s[1]!='O'){
			if(s[0]=='D'){
				int x,y;
//				cerr<<"debug"<<endl;
				x=read(),y=read();
				int m=LCA(x,y);
				ll ans=d[x]+d[y]-2*d[m];
				printf("%lld\n",ans);
			}
			if(s[0]=='K'){
				int a,b,k;
				a=read(),b=read(),k=read();
				int m=LCA(a,b);
//				cout<<m<<endl;
				int x=dep[a]-dep[m];
				int y=dep[b]-dep[m];
				if(k==1) printf("%d\n",a);
				else if(k==dep[a]+dep[b]-2*dep[m]+1)
					printf("%d\n",b);
				else if(x>=k-1){
					int e=a;
					for(int i=lg[k]-1;i>=0;i--){
						if(dep[fa[e][i]]>dep[a]-k+1)
							e=fa[e][i];
					}
					printf("%d\n",fa[e][0]);
				}
				else{
					int sum=dep[a]+dep[b]-2*dep[m]+1;
					k=sum-k;
//					cout<<k<<" "<<sum<<endl;
					int e=b;
					for(int i=lg[k]-1;i>=0;i--){
						if(dep[fa[e][i]]>dep[b]-k)
							e=fa[e][i];
					}
					printf("%d\n",fa[e][0]);
				}
			}
		}
	}
	return 0;
}
/*
1
8
1 2 1
1 3 1
3 4 1
4 5 1
5 6 1
6 7 1
7 8 1
KTH
2 7 5
*/
2020/11/4 15:17
加载中...