#include<iostream>
#include<vector>
#include<algorithm>
#define MAXN 1000000
#define TESTOUT cout<<"TEST"<<endl;
using namespace std;
int siz[MAXN+10],fa[MAXN+10],son[MAXN+10],de[MAXN+10];
int ind[MAXN+10],top[MAXN+10],who[MAXN+10],cnt=0;
int a[MAXN+10],f[4*MAXN+10];
//更赛牛 1 和赛牛 0
int n,m;
vector<int>tree[MAXN+10];
int ls(int x){return (x<<1); }
int rs(int x){return (x<<1|1);}
void build(int l,int r,int now)
{
if(l==r)
{
f[now]=a[who[l]];
return ;
}
int mid=(l+r)>>1;
build(l,mid ,ls(now));
build(mid+1,r,rs(now));
f[now]=f[ls(now)]+f[rs(now)];
}
int ask_sum(int l,int r,int s,int t,int now)
{
int mid=(s+t)>>1,sum=0;
if(l<=s&&r>=t)return f[now];
if(l<=mid)sum+=ask_sum(l,r,s,mid ,ls(now));
if(r> mid)sum+=ask_sum(l,r,mid+1,t,rs(now));
return sum;
}
void dfs1(int u,int fat)
{
int maxn=-0x3f3f3f3f;
siz[u]=1,fa[u]=fat,de[u]=de[fat]+1;
for(int p=0;p<tree[u].size();p++)
{
int v=tree[u][p];
if(v!=fat)
{
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>maxn)
son[u]=v,maxn=siz[v];
}
}
}
void dfs2(int u,int T)
{
ind[u]=++cnt,top[u]=T,who[cnt]=u;
if(!son[u])return ;
dfs2(son[u],T);
for(int p=0;p<tree[u].size();p++)
{
int v=tree[u][p];
if(v!=fa[u]&&v!=son[u])
dfs2(v,v);
}
}
bool check(int u,int v,int k)
{
int sum=0,cu=u,cv=v;
while(top[u]!=top[v])
{
if(de[top[u]]<de[top[v]])swap(u,v);
sum+=ask_sum(ind[top[u]],ind[u],1,n,1);
u=fa[top[u]];
}
if(de[u]>de[v])swap(u,v);
sum+=ask_sum(ind[u],ind[v],1,n,1);
int LCA=u,dis=de[cu]+de[cv]-2*de[LCA];
if(k)return (sum);
else return (sum<dis);
return sum;
}
int main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m;
char ch;
for(int p=1;p<=n;p++)
cin>>ch,a[p]=((ch=='G')?(1):(0));
for(int p=1,x,y;p<n;p++)
{
cin>>x>>y;
tree[x].push_back(y);
tree[y].push_back(x);
}
dfs1(1,-1),dfs2(1,1),build(1,n,1);
for(int p=1,u,v;p<=m;p++)
{
cin>>u>>v>>ch;
cout<<check(u,v,((ch=='G')?(1):(0)));
}
}
一定是很 SB 的错误,可是我没看出来/kk
应该是眼瞎
求助 awa