why 84pts,悬疑馆
查看原帖
why 84pts,悬疑馆
774876
HashHacker_Peas楼主2024/9/8 22:10

rt,WA #7#8,不明白错在哪,希望能指出错误或提供hack,下面是代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10,logn=50;
int n,u,v,f[maxn][logn],sh[maxn],sg[maxn],d[maxn],m;
string s;
char c;
vector<int>g[maxn];
void dfs(int x,int fa){
    d[x]=d[fa]+1,f[x][0]=fa;
    sh[x]=sh[fa]+(s[x-1]=='H'),sg[x]=sg[fa]+(s[x-1]=='G');
    for(int i=1;i<logn;i++)
        f[x][i]=f[f[x][i-1]][i-1];
    for(int i=0;i<g[x].size();i++){
        int to=g[x][i];
        if(to==fa)
            continue;
        dfs(to,x);
    }
}
int lca(int u,int v){
    if(d[u]>d[v])
        swap(u,v);
    int dep=d[v]-d[u];
    for(int i=0;dep;i++,dep>>=1)
        if(dep&1)
            v=f[v][i];
    if(u==v)
        return u;
    for(int i=30;i>=0;i--)
        if(f[u][i]!=f[v][i])
            u=f[u][i],v=f[u][v];
    return f[u][0];
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>m>>s;
    for(int i=1;i<n;i++){
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,0);
    while(m--){
        cin>>u>>v>>c;
        int l=lca(u,v),p;
        if(c=='H')
            p=(sh[u]+sh[v]-sh[l]-sh[f[l][0]]>0);
        if(c=='G')
            p=(sg[u]+sg[v]-sg[l]-sg[f[l][0]]>0);
        cout<<p;
    }
    return 0;
}
2024/9/8 22:10
加载中...