Submission #1227530

#TimeUsernameProblemLanguageResultExecution timeMemory
1227530KindaGoodGamesWorst Reporter 4 (JOI21_worst_reporter4)C++20
0 / 100
256 ms589824 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long
#define tiii tuple<int,int,int>

int INF = numeric_limits<int>::max()/2;

struct SegmentTree{
    vector<int> S;
    int len = 1;

    SegmentTree(int n){
        while(len < n) len <<= 1;
        S.resize(2*len, INF);
    }

    int query(int ql, int qr, int l = 0, int r = -1, int i = 1){
        if(r == -1) r = len;
        if(ql <= l && r <= qr) return S[i];
        if(r <= ql || qr <= l) return INF;

        int mid = (l+r)/2;

        return min(query(ql,qr,l,mid,i*2),query(ql,qr,mid,r,i*2+1));
    }

    void upd(int i, int v){
        i += len;
        S[i] = v;

        for(i /= 2; i > 0; i/=2){
            S[i] = min(S[i*2], S[i*2+1]);
        }
    }
};


vector<int> arr;
vector<int> par;
vector<int> cost;
vector<SegmentTree> dp;
vector<vector<int>> adj;
int n;
void DFS(int v){
    for(auto u : adj[v]){
        DFS(u);
    }

    for(int k = 0; k < n; k++){
        int add = 0;
        if(k != arr[v]){
            add = cost[v];
        }

        int c = 0;
        for(auto u : adj[v]){
            c += dp[u].query(k, n+1);
        }

        dp[v].upd(k,add + c);
    }
}

int32_t main(){
    cin >> n;
    cost = arr = par = vector<int>(n);
    dp.resize(n, SegmentTree(n));
    adj.resize(n);
    for(int i = 0; i < n; i++){
        int a,h,c;
        cin >> a >> h >> c;

        a--;
        par[i] = a;
        arr[i] = h;
        cost[i] = c;
    }

    vector<int> sorted = arr;
    sort(sorted.begin(),sorted.end());
    map<int,int> toInd;
    for(int i = 0; i < n; i++){
        toInd[sorted[i]] = i;
    }
    for(int i = 0; i < n; i++){
        arr[i] = toInd[arr[i]];
    }

    for(int i = 1; i < n; i++){
        adj[par[i]].push_back(i);
    }

    DFS(0);
    cout << dp[0].query(0, n+1) << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...