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;
typedef long long int lli;
typedef long double ld;
typedef pair<ld, ld> pld;
typedef pair<lli, lli> pll;
#define mp(x, y) make_pair(x, y)
const lli MAXN = 5e5+5;
lli N;
lli a[MAXN], b[MAXN];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
for (lli i = 0; i < N; i++) cin >> a[i] >> b[i];
priority_queue<pll> fpos, bpos;
fpos.emplace(-1e9, 0);
bpos.emplace(-1e9, 0);
for (lli i = 0; i < N; i++) {
if (a[i] >= b[i]) {
a[i] -= b[i];
b[i] = 0;
if (a[i] > 0) fpos.emplace(-i, a[i]);
} else {
b[i] -= a[i];
a[i] = 0;
}
}
lli ans = 0;
for (lli i = 0; i < N; i++) {
while (-fpos.top().first <= i) {
bpos.emplace(-fpos.top().first, fpos.top().second);
fpos.pop();
}
while (b[i] > 0) {
lli fp = -fpos.top().first, bp = bpos.top().first;
lli fd = fp - i, bd = i - bp;
if (bd <= fd) {
lli vl = bpos.top().second;
if (vl <= b[i]) {
ans += bd*vl;
b[i] -= vl;
bpos.pop();
} else {
ans += bd*b[i];
vl -= b[i];
b[i] = 0;
pll tmp = mp(bp, vl);
bpos.pop();
bpos.push(tmp);
}
} else {
lli vl = fpos.top().second;
if (vl <= b[i]) {
ans += fd*vl;
b[i] -= vl;
fpos.pop();
} else {
ans += fd*b[i];
vl -= b[i];
b[i] = 0;
pll tmp = mp(-fp, vl);
fpos.pop();
fpos.push(tmp);
}
}
}
}
cout << ans;
return 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |