学校 OJ AC,但是 luogu RE on test 20
查看原帖
学校 OJ AC,但是 luogu RE on test 20
841182
XiangXunYi楼主2024/8/21 20:53

连接

#include <stdio.h>
#include <vector>
using namespace std;
int st1[600000], st2[600000];
struct pbi {
    bool opt;
    int y;
};
vector<pbi> vec1[300000], vec2[300000];
vector<int> g[300000];
namespace cuttree {
int siz[300000], hson[300000], deep[300000], father[300000], top[300000], dfn[300000], rdfn[300000], dcnt;
void dfs1(int u, int fa, int dp) {
    siz[u] = 1;
    deep[u] = dp;
    father[u] = fa;
    for (int v : g[u])
        if (v != fa) {
            dfs1(v, u, dp + 1);
            siz[u] += siz[v];
            if (siz[v] > siz[hson[u]])
                hson[u] = v;
        }
}
void dfs2(int u, int tp) {
    dfn[u] = ++dcnt;
    rdfn[dcnt] = u;
    top[u] = tp;
    if (hson[u] != 0)
        dfs2(hson[u], tp);
    for (int v : g[u])
        if (v != father[u] && v != hson[u])
            dfs2(v, v);
}
void update(int u, int v, int x, bool withoutroot, vector<pbi> *vec) {
    if (deep[u] < deep[v])
        u ^= v ^= u ^= v;
    while (deep[top[u]] > deep[v]) {
        vec[dfn[top[u]]].push_back({ false, x });
        vec[dfn[u] + 1].push_back({ true, x });
        u = father[top[u]];
    }
    vec[dfn[v] + withoutroot].push_back({ false, x });
    vec[dfn[u] + 1].push_back({ true, x });
}
int lca(int u, int v) {
    while (top[u] != top[v]) {
        if (deep[top[u]] < deep[top[v]])
            u ^= v ^= u ^= v;
        u = father[top[u]];
    }
    if (deep[u] > deep[v])
        u ^= v ^= u ^= v;
    return u;
}
}  // namespace cuttree
int n, m, w[300000], ans[300000];
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1, u, v; i < n; ++i) {
        scanf("%d%d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    cuttree::dfs1(1, -1, 0);
    cuttree::dfs2(1, 1);
    for (int i = 1; i <= n; ++i) scanf("%d", w + i);
    for (int i = 1, s, t; i <= m; ++i) {
        scanf("%d%d", &s, &t);
        int l = cuttree::lca(s, t);
        cuttree::update(s, l, cuttree::deep[s], false, vec1);
        cuttree::update(l, t, cuttree::deep[s] - (cuttree::deep[l] << 1), true, vec2);
    }
    for (int i = 1; i <= n; ++i) {
        for (auto [opt, k] : vec1[i])
            if (opt)
                --st1[k + 300000];
            else
                ++st1[k + 300000];
        for (auto [opt, k] : vec2[i])
            if (opt)
                --st2[k + 300000];
            else
                ++st2[k + 300000];
        ans[cuttree::rdfn[i]] = st1[w[cuttree::rdfn[i]] + cuttree::deep[cuttree::rdfn[i]] + 300000] +
                                st2[w[cuttree::rdfn[i]] - cuttree::deep[cuttree::rdfn[i]] + 300000];
    }
    for (int i = 1; i < n; ++i) printf("%d ", ans[i]);
    printf("%d\n", ans[n]);
    return 0;
}
2024/8/21 20:53
加载中...