| Task: | Jobs |
| Sender: | Ukkonen Fan Club |
| Submission time: | 2018-05-26 13:53:48 +0300 |
| Language: | C++ |
| Status: | READY |
| Result: | ACCEPTED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.34 s | details |
| #2 | ACCEPTED | 0.28 s | details |
| #3 | ACCEPTED | 0.31 s | details |
| #4 | ACCEPTED | 0.02 s | details |
| #5 | ACCEPTED | 0.01 s | details |
| #6 | ACCEPTED | 0.01 s | details |
| #7 | ACCEPTED | 0.02 s | details |
| #8 | ACCEPTED | 0.01 s | details |
Code
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
const int N = 2 * (int)1e5;
int as[N];
int bs[N];
int vals[N];
int ind[N];
int used[N];
int b;
int h = 1;
long long sum[4 * N];
int cou[4 * N];
long long getKLast(int i, int k) {
if (cou[i] == k) return sum[i];
int left = 2 * i;
int right = 2 * i + 1;
if (cou[right] >= k) return getKLast(right, k);
return sum[right] + getKLast(left, k - cou[right]);
}
void update(int i) {
int left = 2 * i;
int right = 2 * i + 1;
sum[i] = sum[left] + sum[right];
cou[i] = cou[left] + cou[right];
}
void set(int ind, int v, int i = 1, int ia = 0, int ib = h - 1) {
if (ib < ind || ind < ia) return;
if (ia == ib) {
cou[i] = v;
if (cou[i]) {
sum[i] = vals[ind];
} else {
sum[i] = 0;
}
} else {
int mid = (ia + ib) >> 1;
set(ind, v, 2 * i, ia, mid);
set(ind, v, 2 * i + 1, mid + 1, ib);
update(i);
}
}
long long mins() {
return getKLast(1, b);
}
int main() {
int a, n;
std::cin >> a >> b >> n;
while(h < n) h <<= 1;
std::vector<std::pair<int, int>> ord;
std::vector<std::pair<int, int>> best_a;
std::vector<std::pair<int, int>> best_b;
for (int i = 0; i < n; ++i) {
int va, vb;
std::cin >> va >> vb;
ord.push_back({vb - va, i});
best_a.push_back({-va, i});
best_b.push_back({-vb, i});
as[i] = va;
bs[i] = vb;
}
sort(ord.begin(), ord.end());
sort(best_a.begin(), best_a.end());
sort(best_b.begin(), best_b.end());
for (int i = 0; i < n; ++i) {
vals[i] = ord[i].first;
ind[ord[i].second] = i;
}
int ab = a + b;
long long sum = 0;
for (int j = 0; j < ab; ++j) {
int i = best_a[j].second;
used[i] = 1;
set(ind[i], 1);
sum += as[i];
}
long long res = sum + mins();
int ia = ab;
int ib = 0;
while(ib < ab - 1) {
while(ia > 0) {
--ia;
int i = best_a[ia].second;
--used[i];
if (used[i] == 0) {
sum -= as[i];
set(ind[i], 0);
break;
}
if (ia == 0) {
ia = -1;
break;
}
}
if (ia == -1) break;
while(ib < ab) {
int i = best_b[ib].second;
++ib;
++used[i];
if (used[i] == 1) {
sum += as[i];
set(ind[i], 1);
break;
}
if (ib == ab) {
ib = -1;
break;
}
}
if (ib == -1) break;
res = std::max(res, sum + mins());
}
std::cout << res << '\n';
}
Test details
Test 1
Verdict: ACCEPTED
| input |
|---|
| 12345 54321 200000 159509898 981869288 727914829 812494607 382740364 106927167 291351532 356889470 ... |
| correct output |
|---|
| 58819226961852 |
| user output |
|---|
| 58819226961852 |
Test 2
Verdict: ACCEPTED
| input |
|---|
| 1 1 200000 664293393 446126294 303053683 177744194 130410611 450516458 645484148 777139798 ... |
| correct output |
|---|
| 1999991597 |
| user output |
|---|
| 1999991597 |
Test 3
Verdict: ACCEPTED
| input |
|---|
| 100000 100000 200000 597408010 262805535 561239330 95992085 690324270 432159964 892983528 703183828 ... |
| correct output |
|---|
| 133340028532768 |
| user output |
|---|
| 133340028532768 |
Test 4
Verdict: ACCEPTED
| input |
|---|
| 0 0 1 1 1 |
| correct output |
|---|
| 0 |
| user output |
|---|
| 0 |
Test 5
Verdict: ACCEPTED
| input |
|---|
| 5 0 5 1 10 2 10 3 10 4 10 ... |
| correct output |
|---|
| 15 |
| user output |
|---|
| 15 |
Test 6
Verdict: ACCEPTED
| input |
|---|
| 0 5 5 10 1 10 2 10 3 10 4 ... |
| correct output |
|---|
| 15 |
| user output |
|---|
| 15 |
Test 7
Verdict: ACCEPTED
| input |
|---|
| 2 0 3 3 1 1 1 2 1 |
| correct output |
|---|
| 5 |
| user output |
|---|
| 5 |
Test 8
Verdict: ACCEPTED
| input |
|---|
| 0 2 3 1 3 1 1 1 2 |
| correct output |
|---|
| 5 |
| user output |
|---|
| 5 |
