88分,WA了一个
查看原帖
88分,WA了一个
324807
chl090410楼主2023/2/10 10:09
#include<bits/stdc++.h>
using namespace std;
int f[100005][25],fst[100005],k,dp[200005],n,m,s,u,v,sg[300005],sh[300005];
char c[300005],c1;
struct node{
	int v,nxt;
}e[500005];
void add(int u,int v){
	e[++k].v=v;
	e[k].nxt=fst[u];
	fst[u]=k;
}
void acl(int u,int fa,int d){
	dp[u]=d;f[u][0]=fa;
	sg[u]=sg[fa]+(c[u]=='G');
	sh[u]=sh[fa]+(c[u]=='H');
	for(int i=1;i<=20;i++){
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for(int i=fst[u];i;i=e[i].nxt){
		int vi=e[i].v;
		if(vi!=fa){
			acl(vi,u,d+1);
		}
	}
}
int tj(int u,int v){
	if(dp[u]<dp[v]){
		swap(u,v);
	}
	for(int i=20;i>=0;i--){
		if(dp[u]-(1<<i)>=dp[v]){
			u=f[u][i];
		}
	}
	if(u==v){
		return u;
	}
	for(int i=20;i>=0;i--){
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	}
	return f[u][0];
}
int read(){
	char c;
	int x=0;
	c=getchar();
	while(!isdigit(c)){
		c=getchar();
	}
	while(isdigit(c)){
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++){
		c[i]=getchar();
	}
	for(int i=1;i<=n-1;i++){
		u=read();v=read();
		add(u,v);
		add(v,u);
	}
	acl(1,0,1);
	for(int i=1;i<=m;i++){
		int x,y;
		x=read();y=read();
		c1=getchar();
		int p=f[tj(x,y)][0];
		if(c1=='G'){
			cout<<(sg[x]-sg[p]>0 || sg[y]-sg[p]>0);
		}else{
			cout<<(sh[x]-sh[p]>0 || sh[y]-sh[p]>0);
		}
	}
	return 0;
}
2023/2/10 10:09
加载中...