Submission #1362373

#TimeUsernameProblemLanguageResultExecution timeMemory
1362373alexddWorst Reporter 4 (JOI21_worst_reporter4)C++20
79 / 100
274 ms144456 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int MAXN = 2e5 + 5;
//const int MAXN = 5005;

const int MAXV = 1e9 + 2;

int n;
int parent[MAXN], h[MAXN], c[MAXN];
vector<int> con[MAXN];

map<int,int> difdp[MAXN];
void dfs(int nod)
{
    int maxc = -1, heavy = -1;
    for(int adj:con[nod])
    {
        dfs(adj);
        if((int)difdp[adj].size() > maxc)
            maxc = (int)difdp[adj].size(), heavy = adj;
    }

    if(heavy == -1)
    {
        difdp[nod][h[nod]] = 0;
        difdp[nod][h[nod] + 1] = c[nod];
        difdp[nod][MAXV] = 0;
    }
    else
    {
        swap(difdp[nod], difdp[heavy]);
        for(int adj:con[nod])
        {
            if(adj == heavy)
                continue;
            for(auto it:difdp[adj])
            {
                difdp[nod][it.first] += it.second;
            }
        }

        difdp[nod][1] += c[nod];

        int ramas = c[nod];
        auto it = difdp[nod].upper_bound(h[nod]);
        assert(it != difdp[nod].begin());
        it--;
        assert(it != difdp[nod].end());
        while(ramas > 0)
        {
            int mnm = min(ramas, (*it).second);
            (*it).second -= mnm;
            ramas -= mnm;
            if(ramas == 0)
                break;

            (*it).second = 0;
            it = difdp[nod].erase(it);
            assert(it != difdp[nod].begin());
            it--;
        }

        difdp[nod][h[nod] + 1] += c[nod];
    }

    //for(auto it:difdp[nod]) cerr<<nod<<": "<<it.first<<" "<<it.second<<" difdp\n"; cerr<<"\n\n";
}

void solve_tree()
{
    for(int i=2;i<=n;i++)
        con[parent[i]].push_back(i);
    dfs(1);
    cout<<difdp[1][1];
}

signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>parent[i]>>h[i]>>c[i];
    }

    solve_tree();

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...