倍增lca好像写炸了。。。。不知道该怎们改
查看原帖
倍增lca好像写炸了。。。。不知道该怎们改
865793
better_Z楼主2024/6/8 17:34
#include<iostream>
#include<cmath>
using namespace std;
#define mx 10010
int n,m,head[mx],cnt=0;
int anc[mx][20],g[mx][20],dis[mx];
char c;
struct E{
    int nxt,to;
}e[mx*2];
void add(int a,int b){
    e[++cnt].to=b;
    e[cnt].nxt=head[a];
    head[a]=cnt;
}
void init(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=20;j++){
            anc[i][j]=anc[anc[i][j-1]][j-1];
            g[i][j]=g[anc[i][j-1]][j-1]+g[i][j-1]+dis[i];
        }
    }
}
void dfs(int u,int f){
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==f)continue;
        dfs(v,u);
        anc[v][0]=u;
        g[v][0]=dis[u];
    }
}
int step,sum;
void sol(int beg,int end){
    step=sum=0;
    sum+=dis[beg];
    for(int i=19;i;i--){
        if(end<anc[beg][i]){
            step+=pow(2,i);
            sum+=g[beg][i];
            beg=anc[beg][i];
        }
    }
    step++;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>c;
        if(c=='G')dis[i]=1;
        else dis[i]=-1;
    }
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs(1,0);
    init();
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y>>c;
        if(x==y){
            cout<<((dis[x]==1&&c=='G')||(dis[x]==-1&&c=='H'))?1:0;
            continue;
        }
        sol(y,x);
        if(c=='G'&&step==abs(sum)&&sum>0)cout<<1;
        else if(c=='H'&&step==abs(sum)&&sum<0)cout<<1;
        else if(sum!=step)cout<<1;
        else cout<<0;
    }
    return 0;
}
2024/6/8 17:34
加载中...