Submission #49508574


Source Code Expand

/**
 *  @the_hyp0cr1t3
 *  20.01.2024 18:36
**/
#include <bits/stdc++.h>

using i64 = long long;

template <typename T> struct BIT { // 0-based
    int n;
    std::vector<T> bit;

    BIT(int _n) : n(_n), bit(n + 1) {}

    BIT(const std::vector<T> &a) : n((int)a.size()), bit(n + 1) {
        for (int i = 1; i <= n; i++) {
            bit[i] += a[i - 1];
            if (i + (i & -i) <= n)
                bit[i + (i & -i)] += bit[i];
        }
    }

    T query(int i) {
        T ret{};
        for (i++; i > 0; i -= i & -i)
            ret += bit[i];
        return ret;
    }

    // [l, r]
    T query(int l, int r) { return l > r ? T{} : query(r) - query(l - 1); }

    void update(int i, T val) {
        for (i++; i <= n; i += i & -i)
            bit[i] += val;
    }
};

template <typename Info, typename Tag = int>
class Segtree {
    int n;
    std::vector<Info> info;
    std::vector<Tag> tag;

    void apply(int p, const Tag &v) {
        info[p].apply(v);
        tag[p] += v;
    }
    void push(int p) {
        apply(2 * p, tag[p]);
        apply(2 * p + 1, tag[p]);
        tag[p] = {};
    }
    Info query(int p, int l, int r, int ql, int qr) {
        if (l >= qr or r <= ql)
            return {};
        if (ql <= l and r <= qr)
            return info[p];
        push(p);
        int m = (l + r) / 2;
        return query(2 * p, l, m, ql, qr) + query(2 * p + 1, m, r, ql, qr);
    }
    void update(int p, int l, int r, int ul, int ur, const Tag &v) {
        if (l >= ur or r <= ul)
            return;
        if (ul <= l and r <= ur) {
            apply(p, v);
            return;
        }
        push(p);
        int m = (l + r) / 2;
        update(2 * p, l, m, ul, ur, v);
        update(2 * p + 1, m, r, ul, ur, v);
        info[p] = info[2 * p] + info[2 * p + 1];
    }
    void modify(int p, int l, int r, int i, const Info &v) {
        if (r - l == 1) {
            info[p] = v;
            return;
        }
        push(p);
        int m = (l + r) / 2;
        i < m ? modify(2 * p, l, m, i, v) : modify(2 * p + 1, m, r, i, v);
        info[p] = info[2 * p] + info[2 * p + 1];
    }
    template <typename F>
    int find_first(int p, int l, int r, int fl, int fr, F pred) {
        if (fr <= l or r <= fl or !pred(info[p]))
            return -1;
        if (r - l == 1)
            return l;
        push(p);
        int m = (l + r) / 2;
        int res = find_first(2 * p, l, m, fl, fr, pred);
        if (res == -1)
            res = find_first(2 * p + 1, m, r, fl, fr, pred);
        return res;
    }

public:
    Segtree() : n(0) {}
    Segtree(int _n, Info _v = {}) : Segtree(std::vector(_n, _v)) {}

    template <std::convertible_to<Info> U>
    Segtree(const std::vector<U> &a) : n(a.size()) {
        assert(n > 0);
        int cap = ((1 + !!(n & (n - 1))) << std::__lg(2 * n)) + 1;
        info.resize(cap);
        tag.resize(cap);
        auto build = [&](auto &&self, int p, int l, int r) -> void {
            if (r - l == 1) {
                info[p] = a[l];
                return;
            }
            int m = (l + r) / 2;
            self(self, 2 * p, l, m);
            self(self, 2 * p + 1, m, r);
            info[p] = info[2 * p] + info[2 * p + 1];
        };
        build(build, 1, 0, n);
    }

    Info query(int l, int r) {
        return query(1, 0, n, l, r);
    }
    void modify(int p, const Info &v) {
        modify(1, 0, n, p, v);
    }
    void update(int l, int r, const Tag &v) {
        return update(1, 0, n, l, r, v);
    }
    template <std::predicate<Info> F>
    int find_first(int l, int r, F pred) {
        return find_first(1, 0, n, l, r, pred);
    }
};

struct Info {
    i64 v;
    Info(i64 _v = -1e18) : v(_v) {}
    operator i64() const { return v; }

    void apply(auto t) {
        v += t;
    }
};

Info operator+(Info l, Info r) {
    return Info(std::max(l.v, r.v));
}

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n;
    std::cin >> n;
    std::vector<std::vector<int>> g(n);
    for (int i = 1; i < n; i++) {
        int u, v;
        std::cin >> u >> v;
        --u, --v;
        g[u].emplace_back(v);
        g[v].emplace_back(u);
    }

    std::vector<int> tour, tin(n), tout(n), sub(n + 1, 1);
    sub[n] = 0;
    auto prep = [&](auto &&self, int u, int p) -> void {
        if (~p) g[u].erase(std::ranges::find(g[u], p));
        tin[u] = tour.size();
        tour.push_back(u);
        for (auto v : g[u]) {
            self(self, v, u);
            sub[u] += sub[v];
        }
        tout[u] = tour.size();
    };
    prep(prep, 0, -1);

    BIT<i64> bit(n);
    Segtree<Info, i64> st(n);
    for (int i = n - 1; i >= 0; i--) {
        st.update(0, n, +1);
        st.modify(tin[i], 0);
    }

    std::vector<i64> ans(n);
    auto dfs = [&](auto &&self, int u, bool keep) -> void {
        int bv = n;
        for (auto v : g[u])
            if (sub[v] > sub[bv]) bv = v;
    
        for (auto v : g[u])
            if (v != bv) self(self, v, false);
    
        if (bv != n) self(self, bv, true);
    
        bit.update(u, +1);
        for (auto v : g[u]) if (v != bv) {
            for (int i = tin[v]; i < tout[v]; i++)
                bit.update(tour[i], +1);
        }

        i64 x = bit.query(u - 1);
        st.update(tin[u], tin[u] + 1, -2 * x);
        st.update(0, 1, +x);
        ans[u] = +x;

        if (!keep) {
            for (int i = tin[u]; i < tout[u]; i++)
                bit.update(tour[i], -1);
        }
    };
    dfs(dfs, 0, true);

    auto dfs2 = [&](auto &&self, int u, i64 add = 0) -> void {
        add += st.query(tin[u], tin[u] + 1);
        ans[u] += add;
        for (auto v : g[u])
            self(self, v, add);
    };
    dfs2(dfs2, 0);

    for (int i = 0; i < n; i++)
        std::cout << ans[i] << " \n"[i + 1 == n];
}

Submission Info

Submission Time
Task G - Tree Inversion
User the_hyp0cr1t3
Language C++ 20 (gcc 12.2)
Score 0
Code Size 6042 Byte
Status WA
Exec Time 410 ms
Memory 66096 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 600
Status
AC × 2
WA × 1
AC × 23
WA × 49
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt, 01_random_35.txt, 01_random_36.txt, 01_random_37.txt, 01_random_38.txt, 01_random_39.txt, 01_random_40.txt, 01_random_41.txt, 01_random_42.txt, 01_random_43.txt, 01_random_44.txt, 01_random_45.txt, 01_random_46.txt, 01_random_47.txt, 01_random_48.txt, 01_random_49.txt, 01_random_50.txt, 01_random_51.txt, 01_random_52.txt, 01_random_53.txt, 01_random_54.txt, 01_random_55.txt, 01_random_56.txt, 01_random_57.txt, 01_random_58.txt, 01_random_59.txt, 01_random_60.txt, 01_random_61.txt, 01_random_62.txt, 01_random_63.txt, 02_handmade_64.txt, 02_handmade_65.txt, 02_handmade_66.txt, 02_handmade_67.txt, 02_handmade_68.txt, 02_handmade_69.txt, 02_handmade_70.txt, 02_handmade_71.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3476 KiB
00_sample_01.txt AC 1 ms 3552 KiB
00_sample_02.txt WA 1 ms 3484 KiB
01_random_03.txt WA 218 ms 29244 KiB
01_random_04.txt AC 328 ms 62272 KiB
01_random_05.txt WA 336 ms 28592 KiB
01_random_06.txt WA 298 ms 28756 KiB
01_random_07.txt WA 233 ms 29288 KiB
01_random_08.txt AC 361 ms 50684 KiB
01_random_09.txt WA 334 ms 28544 KiB
01_random_10.txt WA 309 ms 28776 KiB
01_random_11.txt WA 237 ms 29288 KiB
01_random_12.txt AC 354 ms 61840 KiB
01_random_13.txt WA 356 ms 28684 KiB
01_random_14.txt WA 314 ms 28692 KiB
01_random_15.txt WA 233 ms 29216 KiB
01_random_16.txt AC 350 ms 51828 KiB
01_random_17.txt WA 348 ms 28604 KiB
01_random_18.txt WA 312 ms 28828 KiB
01_random_19.txt WA 233 ms 29296 KiB
01_random_20.txt AC 341 ms 61724 KiB
01_random_21.txt WA 339 ms 28552 KiB
01_random_22.txt WA 308 ms 28800 KiB
01_random_23.txt WA 226 ms 29292 KiB
01_random_24.txt AC 335 ms 58420 KiB
01_random_25.txt WA 357 ms 28560 KiB
01_random_26.txt WA 330 ms 28804 KiB
01_random_27.txt WA 237 ms 29312 KiB
01_random_28.txt AC 344 ms 58016 KiB
01_random_29.txt WA 344 ms 28608 KiB
01_random_30.txt WA 329 ms 28828 KiB
01_random_31.txt WA 6 ms 4120 KiB
01_random_32.txt AC 55 ms 17312 KiB
01_random_33.txt WA 182 ms 17648 KiB
01_random_34.txt WA 321 ms 27876 KiB
01_random_35.txt WA 122 ms 17808 KiB
01_random_36.txt WA 329 ms 26944 KiB
01_random_37.txt WA 23 ms 6244 KiB
01_random_38.txt WA 89 ms 15016 KiB
01_random_39.txt AC 27 ms 8640 KiB
01_random_40.txt WA 60 ms 9540 KiB
01_random_41.txt WA 288 ms 26196 KiB
01_random_42.txt WA 74 ms 13852 KiB
01_random_43.txt WA 168 ms 16932 KiB
01_random_44.txt WA 331 ms 27956 KiB
01_random_45.txt WA 32 ms 8716 KiB
01_random_46.txt AC 128 ms 23188 KiB
01_random_47.txt WA 9 ms 4392 KiB
01_random_48.txt WA 305 ms 27808 KiB
01_random_49.txt WA 134 ms 18224 KiB
01_random_50.txt WA 180 ms 17060 KiB
01_random_51.txt WA 129 ms 14800 KiB
01_random_52.txt WA 253 ms 29296 KiB
01_random_53.txt AC 397 ms 59236 KiB
01_random_54.txt WA 373 ms 28468 KiB
01_random_55.txt WA 369 ms 28684 KiB
01_random_56.txt WA 262 ms 29396 KiB
01_random_57.txt AC 410 ms 51688 KiB
01_random_58.txt WA 385 ms 28464 KiB
01_random_59.txt WA 360 ms 28692 KiB
01_random_60.txt WA 265 ms 29320 KiB
01_random_61.txt AC 397 ms 62008 KiB
01_random_62.txt WA 374 ms 28508 KiB
01_random_63.txt WA 343 ms 28756 KiB
02_handmade_64.txt AC 1 ms 3552 KiB
02_handmade_65.txt AC 1 ms 3556 KiB
02_handmade_66.txt AC 281 ms 65976 KiB
02_handmade_67.txt AC 269 ms 65952 KiB
02_handmade_68.txt AC 268 ms 66096 KiB
02_handmade_69.txt AC 266 ms 65952 KiB
02_handmade_70.txt AC 287 ms 66000 KiB
02_handmade_71.txt AC 276 ms 66004 KiB