This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
void just_do_it();
int main() {
#ifdef KAMIRULEZ
freopen("kamirulez.inp", "r", stdin);
freopen("kamirulez.out", "w", stdout);
#endif
ios_base::sync_with_stdio(0);
cin.tie(0);
just_do_it();
return 0;
}
struct func {
long long slope = 0;
long long last = 0;
priority_queue<long long> q;
void init(int w) {
slope = 1;
last = 0;
q.push(w);
q.push(w);
}
long long update(int w) {
long long lt = -1;
long long rt = -1;
while (slope > 0) {
long long cur = q.top();
q.pop();
long long prv = q.top();
if (slope == 1) {
lt = prv;
rt = cur;
}
slope--;
last -= slope * (cur - prv);
}
q.pop();
q.push(lt + w);
q.push(rt + w);
slope = 1;
return last;
}
void merge(func &f2) {
if (q.empty()) {
slope = f2.slope;
last = f2.last;
swap(q, f2.q);
return;
}
if (q.top() > f2.q.top()) {
last = last + (f2.last + f2.slope * (q.top() - f2.q.top()));
}
else {
last = f2.last + (last + slope * (f2.q.top() - q.top()));
}
slope += f2.slope;
if (q.size() < f2.q.size()) {
swap(q, f2.q);
}
while (!f2.q.empty()) {
q.push(f2.q.top());
f2.q.pop();
}
}
};
const int maxN = 3e5 + 20;
vector<pair<int, int>> ch[maxN];
func f[maxN];
int N, M;
void dfs(int u) {
for (auto p: ch[u]) {
int v = p.first;
int w = p.second;
if (N + 1 <= v && v <= N + M) {
f[v].init(w);
}
else {
dfs(v);
f[v].update(w);
}
f[u].merge(f[v]);
}
}
void just_do_it() {
cin >> N >> M;
for (int v = 2; v <= N + M; v++) {
int u, w;
cin >> u >> w;
ch[u].emplace_back(v, w);
}
dfs(1);
cout << f[1].update(0);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |