Submission #555053

#TimeUsernameProblemLanguageResultExecution timeMemory
555053JomnoiFireworks (APIO16_fireworks)C++17
100 / 100
176 ms64696 KiB
#include <bits/stdc++.h> #define DEBUG false using namespace std; const int MAX_N = 3e5 + 10; int P[MAX_N], C[MAX_N]; class SlopeTrick { public : long long m, c; priority_queue <long long> *pq; SlopeTrick() : m(0), c(0), pq(new priority_queue <long long>) {} SlopeTrick operator+(const SlopeTrick &o) const { SlopeTrick result; result.m = m + o.m; result.c = c + o.c; if(pq->size() > o.pq->size()) { result.pq = pq; while(!o.pq->empty()) { result.pq->push(o.pq->top()); o.pq->pop(); } } else { result.pq = o.pq; while(!pq->empty()) { result.pq->push(pq->top()); pq->pop(); } } return result; } }D[MAX_N]; int main() { cin.tie(nullptr)->sync_with_stdio(false); int N, M; cin >> N >> M; for(int i = 2; i <= N + M; i++) { cin >> P[i] >> C[i]; } for(int i = N + 1; i <= N + M; i++) { D[i].m = 1; D[i].c = -C[i]; D[i].pq->push(C[i]); D[i].pq->push(C[i]); D[P[i]] = D[P[i]] + D[i]; } for(int i = N; i >= 2; i--) { while(D[i].m > 1) { D[i].m--; D[i].c += D[i].pq->top(); D[i].pq->pop(); } long long slope1 = D[i].pq->top(); D[i].pq->pop(); long long slope0 = D[i].pq->top(); D[i].pq->pop(); D[i].pq->push(slope1 + C[i]); D[i].pq->push(slope0 + C[i]); D[i].c -= C[i]; D[P[i]] = D[P[i]] + D[i]; } while(D[1].m > 0) { D[1].m--; D[1].c += D[1].pq->top(); D[1].pq->pop(); } cout << D[1].c; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...