LCA做法40分求助
查看原帖
LCA做法40分求助
574215
OneLeft楼主2023/10/11 11:22

rt,code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,M=15;
struct node
{
    bool H,G;
    int fa;
}f[N][M];
char a[N],w;
int n,m,u,v,deep[N],Log[N];
vector<int>edge[N];
void build(int u,int v)
{
    edge[u].push_back(v);
    edge[v].push_back(u);
}
void init(int u,int fa)
{
    f[u][0].fa=fa,deep[u]=deep[fa]+1;
    if(a[u]=='H'||a[fa]=='H')f[u][0].H=true;
    if(a[u]=='G'||a[fa]=='G')f[u][0].G=true;
    for(int i=1;i<=Log[n];i++)
    {
        f[u][i].H=f[u][i-1].H|f[f[u][i-1].fa][i-1].H;
        f[u][i].G=f[u][i-1].G|f[f[u][i-1].fa][i-1].G;
        f[u][i].fa=f[f[u][i-1].fa][i-1].fa;
    }
    for(auto v:edge[u])
        if(v!=fa)init(v,u);
}
bool find(int x,int y,char z)
{
    if(x==y)
    {
        if(z=='H')
        {
            if(a[x]=='H')return true;
            return false;
        }
        if(a[x]=='G')return true;
        return false;
    }
    bool H=false,G=false;
    if(deep[x]<deep[y])swap(x,y);
    for(int i=Log[n];i>=0;i--)
    {
        if(deep[f[x][i].fa]>=deep[y])
        {
            H|=f[x][i].H,G|=f[x][i].G;
            x=f[x][i].fa;
        }
    }
    if(x==y)
    {
        if(z=='H')return H;
        return G;
    }
    for(int i=Log[n];i>=0;i--)
    {
        if(f[x][i].fa!=f[y][i].fa)
        {
            H|=f[x][i].H|f[y][i].H;
            G|=f[x][i].G|f[y][i].G;
            x=f[x][i].fa,y=f[y][i].fa;
        }
    }
    H|=f[x][0].H|f[y][0].H;
    G|=f[x][0].G|f[y][0].G;
    if(z=='H')return H;
    else return G;
}
signed main()
{
    Log[0]=-1;
    cin>>n>>m;
    for(int i=1;i<=n;i++)Log[i]=Log[i/2]+1;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<n;i++)
        cin>>u>>v,build(u,v);
    init(1,0);
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v>>w;
        if(find(u,v,w))cout<<1;
        else cout<<0;
    }
    return 0;
}
2023/10/11 11:22
加载中...