大佬们,16分调了两天了真的看不出来哪里错了
查看原帖
大佬们,16分调了两天了真的看不出来哪里错了
181715
gjh303987897楼主2023/4/12 17:30
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<stdlib.h>
#include<queue>
#include<climits>

int read(){
    int x=0,f=1; char ch=getchar();
    while(ch>'9'||ch<'0'){ if(ch=='-'){ f=-1; } ch=getchar(); }
    while(ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
    return x*f; 
}

const int maxn = 1e5+11;

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

int w[maxn];
int lg[maxn];
int dep[maxn];
int fa[maxn][22][3];
void dfs(int now,int last){
    dep[now]=dep[last]+1;
    fa[now][0][0]=last;
    fa[now][0][1]=(w[now]==1)|(w[last]==1);
    fa[now][0][2]=(w[now]==2)|(w[last]==2);
    for(int i=1;i<=lg[dep[now]];i++){
        fa[now][i][0]=fa[fa[now][i-1][0]][i-1][0];
        fa[now][i][1]=(fa[fa[now][i-1][1]][i-1][1])|(fa[now][i-1][1]);
        fa[now][i][2]=(fa[fa[now][i-1][2]][i-1][2])|(fa[now][i-1][2]);
    }
    for(int i=head[now];i;i=t[i].next){
        int to = t[i].to;
        if(to != last){
            dfs(to,now);
        }
    }
}

bool lca(int s1,int s2,int s3){
    if(dep[s1]<dep[s2]) std:: swap(s1,s2);
    while(dep[s1]>dep[s2]){
        if(fa[s1][lg[dep[s1]-dep[s2]]-1][s3]!=0){
            return true;
        }
        s1 = fa[s1][lg[dep[s1]-dep[s2]]-1][0];    
    }
    if(s1 == s2){
        if(w[s1]==s3){
            return true;
        }else return false;
    }
    for(int i=lg[dep[s1]]-1;i>=0;i--){
        if(fa[s1][i][0]!=fa[s2][i][0]){
            if((fa[s1][i][s3]!=0)||(fa[s2][i][s3])!=0){
                return true;
            }
            s1 = fa[s1][i][0];
            s2 = fa[s2][i][0];
        }
    }
    return fa[s1][0][s3]!=0 ? true:false;
}

int main(){
    int n=read(),q=read();
    std:: string str; std:: cin>>str;
    for(int i=1;i<=n;i++){
        if(str[i-1]=='H') w[i]=1;
        else w[i]=2;
    }
    for(int i=1;i<n;i++){
        int x=read(),y=read();
        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<=q;i++){
        int x=read(),y=read(),z;
        std:: string ss;
        std:: cin>>ss;
        if(ss[0]=='H'){
            z=1;
        }else z=2;
        if(lca(x,y,z)) std:: cout<<"1";
        else std:: cout<<"0";
    }
    return 0;
}
2023/4/12 17:30
加载中...