제출 #1161369

#제출 시각아이디문제언어결과실행 시간메모리
1161369Der_VlaposCat Exercise (JOI23_ho_t4)C++20
41 / 100
220 ms74008 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pii pair<int, int>
#define f first
#define s second
#define all(v) v.begin(), v.end()
#define pb push_back

const int BIG = 1e9 + 10;
#define int ll

struct DSU
{
    vector<int> p;
    vector<int> mx;

    void init(int n)
    {
        p.resize(n);
        mx.resize(n);
        for (int i = 0; i < n; ++i)
            p[i] = i;
    }

    int getR(int v)
    {
        return p[v] == v ? v : p[v] = getR(p[v]);
    }

    void merge(int x, int y)
    {
        x = getR(x);
        y = getR(y);
        if (x == y)
            return;
        if (mx[x] > mx[y])
            swap(x, y);
        p[x] = y;
    }
};

struct test
{
    vector<vector<int>> tree, jump;
    vector<int> d, tin, tout;
    int timer = 0;

    void precalc(int v, int pr = -1)
    {
        tin[v] = ++timer;

        for (auto tov : tree[v])
            if (tov != pr)
            {
                d[tov] = d[v] + 1;
                jump[tov][0] = v;
                for (int i = 1; i < 20; ++i)
                {
                    jump[tov][i] = jump[jump[tov][i - 1]][i - 1];
                }
                precalc(tov, v);
            }

        tout[v] = ++timer;
    }

    bool isParent(int x, int y)
    {
        return tin[x] <= tin[y] and tout[y] <= tout[x];
    }

    int lca(int x, int y)
    {
        if (isParent(x, y))
            return x;
        if (isParent(y, x))
            return y;
        for (int i = 19; i >= 0; --i)
            if (!isParent(jump[x][i], y))
                x = jump[x][y];
        return jump[x][0];
    }

    int getD(int x, int y)
    {
        return d[x] + d[y] - 2 * d[lca(x, y)];
    }

    void solve()
    {
        int n;
        cin >> n;
        tree.resize(n);
        jump.resize(n, vector<int>(20));
        d.resize(n);
        tin.resize(n);
        tout.resize(n);
        vector<pii> els;
        vector<int> a(n);
        for (int i = 0; i < n; ++i)
        {
            int x;
            cin >> x;
            els.pb({x, i});
            a[i] = x;
        }
        sort(all(els));
        tree.resize(n);
        for (int i = 1; i < n; ++i)
        {
            int x, y;
            cin >> x >> y;
            --x, --y;
            tree[x].pb(y);
            tree[y].pb(x);
        }
        precalc(0);
        vector<int> res(n);

        DSU dsu;
        dsu.init(n);
        for (int i = 0; i < n; ++i)
            dsu.mx[i] = a[i];

        for (auto [val, v] : els)
        {
            int curMx = 0;
            for (auto tov : tree[v])
                if (a[tov] < a[v])
                {
                    int nextV = dsu.getR(tov);
                    curMx = max(curMx, res[nextV] + getD(nextV, v));
                }

            res[v] = curMx;
            for (auto tov : tree[v])
                if (a[tov] < a[v])
                {
                    dsu.merge(v, tov);
                }

            if (val == n)
                cout << res[v] << "\n";
        }
    }
};

main()
{
    test t;
    t.solve();
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp:151:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  151 | main()
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...