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>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/trie_policy.hpp>
// #include <ext/rope>
using namespace std;
// using namespace __gnu_cxx;
// using namespace __gnu_pbds;
void Hollwo_Pelw();
signed main(){
#ifndef hollwo_pelw_local
if (fopen(".inp", "r"))
assert(freopen(".inp", "r", stdin)), assert(freopen(".out", "w", stdout));
#else
using namespace chrono;
auto start = steady_clock::now();
#endif
cin.tie(0), cout.tie(0) -> sync_with_stdio(0);
int testcases = 1;
// cin >> testcases;
for (int test = 1; test <= testcases; test++){
// cout << "Case #" << test << ": ";
Hollwo_Pelw();
}
#ifdef hollwo_pelw_local
cout << "\nExecution time : " << duration_cast<milliseconds> (steady_clock::now() - start).count() << "[ms]" << endl;
#endif
}
#define int long long
const int N = 3e5 + 5;
// wtf slope trick
int n, m, p[N], c[N];
struct slope_t {
priority_queue<int> pq;
int slp = 0, res = 0;
inline void swap(slope_t &oth) {
pq.swap(oth.pq);
std::swap(slp, oth.slp);
std::swap(res, oth.res);
}
inline void merge(slope_t &oth) {
if (pq.size() < oth.pq.size()) swap(oth);
if (!oth.pq.empty()) {
if (pq.top() > oth.pq.top())
res += oth.slp * (pq.top() - oth.pq.top());
if (pq.top() < oth.pq.top())
res += slp * (oth.pq.top() - pq.top());
}
res += oth.res;
slp += oth.slp;
for (; !oth.pq.empty(); oth.pq.pop())
pq.push(oth.pq.top());
}
inline void __init__(int v) {
slp = 1, res = 0;
pq.push(v), pq.push(v);
}
inline void __norm__(int v) {
for (; slp > 1; slp --) {
int last = pq.top(); pq.pop();
res -= (last - pq.top()) * (slp - 1);
}
int slp1 = pq.top(); pq.pop();
int slp0 = pq.top(); pq.pop();
pq.push(slp0 + v);
pq.push(slp1 + v);
}
inline void print() {
priority_queue<int> f = pq;
cout << "pq = { ";
while (!f.empty())
cout << f.top() << ' ', f.pop();
cout << "}\n";
cout << "slp = " << slp << '\n';
cout << "ans = " << res << '\n';
}
} slope_trick[N];
void Hollwo_Pelw(){
cin >> n >> m;
for (int i = 2; i <= n + m; i++)
cin >> p[i] >> c[i];
for (int i = n + m; i > 1; i--) {
// cout << "\nsolve " << i << "\n";
// slope_trick[i].print();
if (i > n) {
slope_trick[i].__init__(c[i]);
} else {
slope_trick[i].__norm__(c[i]);
}
// slope_trick[i].print();
slope_trick[p[i]].merge(slope_trick[i]);
}
slope_trick[1].__norm__(0);
cout << slope_trick[1].res << '\n';
}
# | 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... |