倍增LCA试水第一题,在线等!
查看原帖
倍增LCA试水第一题,在线等!
833124
BIOS楼主2023/6/5 22:12
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1e5 + 5, M = 2e5 + 5;
int h[N], e[M], ne[M], val[N], dist[N], a, p, b, n, m, idx, d, v, de[N], fa[N][18];
char ch, s[N];
bool st[N];
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void bfs()
{
    memset(de, 0x3f, sizeof(de));
    queue<int> q;
    de[0] = 0, de[1] = 1;
    q.push(1);
    while (q.size())
    {
        int t = q.front();
        q.pop();
        for (int i = h[t]; ~i; i = ne[i])
        {
            int j = e[i];
            if (de[j] > de[t] + 1)
            {
                de[j] = de[t] + 1, fa[j][0] = t, q.push(j);
                for (int k = 1; k <= 17; k++)
                    fa[j][k] = fa[fa[j][k - 1]][k - 1];
            }
        }
    }
}
void dfs(int u, int father)
{
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (j == father)
            continue;
        dist[j] = dist[u] + 1;
        val[j] += val[u];
        dfs(j, u);
    }
}
int lca(int a, int b)
{
    if (de[a] < de[b])
        swap(a, b);
    for (int k = 17; k >= 0; k--)
        if (de[fa[a][k]] >= de[b])
            a = fa[a][k];
    if (a == b)
        return a;
    for (int k = 17; k >= 0; k--)
        if (fa[a][k] != fa[b][k])
            a = fa[a][k], b = fa[b][k];
    return fa[a][0];
}
int main()
{
    memset(h, -1, sizeof(h));
    cin >> n >> m;
    scanf("%s", s + 1);
    for (int i = 1; i <= n; i++)
        st[i] = val[i] = (s[i] == 'H');
    for (int i = 1; i < n; i++)
        scanf("%d%d", &a, &b), add(a, b), add(b, a);
    bfs();
    dist[1] = 1;
    dfs(1, -1);
    while (m--)
    {
        cin >> a >> b >> ch;
        if (a == b)
        {
            if (ch == 'H')
                printf("%d", st[a]);
            else
                printf("%d", !st[a]);
            continue;
        }
        p = lca(a, b);
        d = dist[a] + dist[b] - 2 * dist[p];
        v = val[a] + val[b] - 2 * val[p];
        if (ch == 'H')
        {
            if (v > 0)
                printf("%d", 1);
            else
                printf("%d", 0);
        }
        else
        {
            if (v < d)
                printf("%d", 1);
            else
                printf("%d", 0);
        }
    }
    puts("");
}

52pts,还行,比我预想的火烧云强(

下了一个数据看了一下第一行的输出,是一样的,大概是那些细节出了问题吧,求大佬们帮忙找一找,蒟蒻刚写的第一道题,LCA没什么debug能力啊...

2023/6/5 22:12
加载中...