LCA 16分求助
查看原帖
LCA 16分求助
181715
gjh303987897楼主2022/4/25 21:53
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0'){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
const int maxn = 1e6+10;

struct tree{
    int next,to;
}t[maxn<<1];
int js,head[maxn<<1];
int in[maxn],val[maxn];
inline void add(int u,int v){
    t[++js].next=head[u];
    t[js].to=v;
    head[u]=js;
}

int lg[maxn];
int f[maxn][20],death[maxn];
void dfs(int u,int fa){
    death[u]=death[fa]+1;
    f[u][0]=fa;
    val[u]+=val[fa];
    for(int i=1;(1<<i)<=death[u];i++){
        f[u][i]=f[f[u][i-1]][i-1];
    }
    for(int i=head[u];i;i=t[i].next){
        if(fa!=t[i].to){
            dfs(t[i].to, u);
        }
    }
}
int LCA(int a,int b){
    if(death[a]>death[b]) swap(a,b);
    while(death[a]>death[b]){
        a=f[a][lg[death[a]-death[b]]-1];
    }
    if(a==b) return a;
    for(int i=17;i>=0;--i){
        if(f[a][i]==f[b][i]) continue;
        else {
            a=f[a][i]; b=f[b][i];
        }
    }
    return f[a][0];
}
int rec[maxn];
int main(){
    int n,m;
    cin>>n>>m;
    string ss; cin>>ss;
    for(int i=0;i<n;i++){
        if(ss[i]=='H') val[i+1]=1;
        else val[i+1]=0;
    }
    for(int i=1;i<n;i++){
        int x,y; cin>>x>>y;
        add(x,y); add(y,x);
    }
    for(int i=1;i<=n;i++){
        lg[i]=lg[i-1]+((1<<lg[i-1])==i);
    }
    dfs(1,0);
    for(int i=1;i<=m;i++){
        int x,y; cin>>x>>y;
        string type;//H--1 G--0
        cin>>type;
        if(x==y){
            if(ss[x-1]==type[0]) cout<<1;
            else cout<<0;
            continue;
        }
        int lca=LCA(x, y);
        int ans=val[x]+val[y]-(val[lca]<<1)+1;
        int standard=death[x]+death[y]-(death[lca]<<1)+1;
        if(type[0]=='H'){
            ans!=0?cout<<1:cout<<0;
        }else{
            ans!=standard?cout<<1:cout<<0;
        }
    }
    return 0;
}

2022/4/25 21:53
加载中...