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 |