8pts求调玄关
查看原帖
8pts求调玄关
1036180
ChampionCyan楼主2024/7/29 16:49
#include <bits/stdc++.h>
using namespace std;
char var[100005];
vector<int> a[100005];
int n, m, dfn[100005], st[18][100005], d = 1, b[2][100005];

void dfs(int fa, int ch, int hnum, int gnum) {
    b[0][ch] = hnum, b[1][ch] = gnum;
    if (var[ch - 1] == 'H')
        b[0][ch]++;
    else
        b[1][ch]++;
    st[0][d] = fa;
    dfn[ch] = d++;
    for (int i = 0; i < a[ch].size(); i++)
        if (a[ch][i] != fa)
            dfs(ch, a[ch][i], b[0][ch], b[1][ch]);
}

inline void build() {
    int len = log2(n);
    for (int i = 1; i <= len; i++)
        for (int j = 1; j <= n - (1 << i) + 1; j++)
            if (dfn[st[i - 1][j]] < dfn[st[i - 1][j + (1 << i - 1)]])
                st[i][j] = st[i - 1][j];
            else
                st[i][j] = st[i - 1][j + (1 << i - 1)];
}

inline int query(int u, int v) {
    if (u == v)
        return u;
    u = dfn[u], v = dfn[v];
    if (u > v)
        swap(u, v);
    int len = log2(v - u++);
    if (dfn[st[len][u]] < dfn[st[len][v - (1 << len) + 1]])
        return dfn[st[len][u]];
    return dfn[st[len][v - (1 << len) + 1]];
}

inline bool myfind(int u, int v, int lca, char like) {
    int fa = st[0][dfn[lca]];
    if (like == 'H' && (b[0][u] - b[0][fa] || b[0][v] - b[0][fa]))
        return true;
    if (like == 'G' && (b[1][u] - b[1][fa] || b[1][v] - b[1][fa]))
        return true;
    return false;
}

int main() {
    int u, v, lca;
    char like;
    scanf("%d%d%s", &n, &m, &var);
    for (int i = 1; i < n; i++) {
        scanf("%d%d", &u, &v);
        a[u].push_back(v);
        a[v].push_back(u);
    }
    dfs(0, 1, 0, 0);
    build();
    for (int i = 1; i <= m; i++) {
        scanf("%d%d %c", &u, &v, &like);
        lca = query(u, v);
        if (myfind(u, v, lca, like))
            putchar('1');
        else
            putchar('0');
    }
    return 0;
}
2024/7/29 16:49
加载中...