倍增LCA,莫名八分,其他全wa,求大佬帮助
查看原帖
倍增LCA,莫名八分,其他全wa,求大佬帮助
70081
尹昱钦楼主2020/9/12 00:11
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<ctime>
#include<stack>
using namespace std;
const int maxn=100005;
int n,m,st[maxn][30][3],deep[maxn],cnt,p[maxn];
string s;
int ans[maxn];
struct node{
	int v,next;
}e[maxn*2];
void insert(int u,int v){
	cnt++;
	e[cnt].next=p[u];
	e[cnt].v=v;
	p[u]=cnt;
}
void dfs(int u,int fa,int dep){
	deep[u]=dep;
	st[u][0][0]=fa;
	st[u][0][1]=(s[u-1]=='G')||(fa>0&&s[fa-1]=='G');
	st[u][0][2]=(s[u-1]=='H')||(fa>0&&s[fa-1]=='H');
	for(int i=p[u];i!=-1;i=e[i].next){
		int v=e[i].v;
		if(v==fa) continue;
		dfs(v,u,dep+1);
	}
}
int main()
{
	memset(p,-1,sizeof(p));
    cin>>n>>m>>s;
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		insert(u,v);
		insert(v,u);
	}
	dfs(1,-1,1);
	for(int i=1;i<=n;i++){
		for(int j=1;(1<<j)<deep[i];j++){
			st[i][j][0]=st[st[i][j-1][0]][j-1][0];
			st[i][j][1]=st[i][j-1][1]||st[st[i][j-1][0]][j-1][1];
			st[i][j][2]=st[i][j-1][2]||st[st[i][j-1][0]][j-1][2];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=20;j++){
			if(st[i][j][0]<=0) st[i][j][0]=st[i][j][1]=st[i][j][2]=0;
//			cout<<i<<" "<<j<<" "<<st[i][j][0]<<" "<<st[i][j][1]<<" "<<st[i][j][2]<<endl;
		}
	}
	for(int i=1;i<=m;i++){
		int a,b;
		char c;
//		scanf("%d%d%c",&a,&b,&c);
		cin>>a>>b>>c;
		int d=(c=='G'?1:2);
//		cout<<deep[a]<<" "<<deep[b]<<endl;
		if(a==b){
			ans[i]=(s[a-1]==c?1:0);
			continue;
		}
		if(deep[a]<deep[b]) swap(a,b);
		for(int j=20;j>=0;j--){
			if(deep[a]==deep[b]) break;
			if(deep[st[a][j][0]]<deep[b]) continue;
			if(st[a][j][d]){
				ans[i]=1;
				break;
			}
			a=st[a][j][0];
		}
//		cout<<deep[a]<<" "<<deep[b]<<endl;
		for(int j=20;(!ans[i])&&j>=0;j--){
			if(st[a][j][0]==st[b][j][0]) continue;
			if(st[a][j][d]||st[b][j][d]){
				ans[i]=1;
				break;
			}
			a=st[a][j][0];b=st[b][j][0];
		}
		if(ans[i]==0&&a!=b&&st[a][0][d]) ans[i]=1;
	}
	for(int i=1;i<=m;i++) printf("%d",ans[i]);
    return 0;
}

2020/9/12 00:11
加载中...