Submission #176003

#TimeUsernameProblemLanguageResultExecution timeMemory
176003emil_physmathSchools (IZhO13_school)C++17
100 / 100
274 ms17272 KiB
// #define DEBUG
#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
using namespace std;
typedef long long llong;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n, aNum, bNum;
    cin >> n >> aNum >> bNum;
    struct City
    {
        int a, b;
    };
    vector<City> cities(n);
    for (int i = 0; i < n; ++i)
        cin >> cities[i].a >> cities[i].b;
    if (!aNum)
    {
        sort(cities.begin(), cities.end(), [](const City& lhs, const City& rhs) {
             return lhs.b > rhs.b;
        });
        long long ans = 0;
        for (int i = 0; i < bNum; ++i)
            ans += cities[i].b;
        cout << ans;
        exit(0);
    }
    if (!bNum)
    {
        sort(cities.begin(), cities.end(), [](const City& lhs, const City& rhs) {
             return lhs.a > rhs.a;
        });
        long long ans = 0;
        for (int i = 0; i < aNum; ++i)
            ans += cities[i].a;
        cout << ans;
        exit(0);
    }
    sort(cities.begin(), cities.end(), [](const City& lhs, const City& rhs) {
         return lhs.a - lhs.b > rhs.a - rhs.b;
    });
    vector<long long> pref(n, -30'000'000'000LL), suff(n, -30'000'000'000LL);
    multiset<int> a;
    long long sum = 0;
    for (int i = 0; i < aNum; ++i)
    {
        a.insert(cities[i].a);
        sum += cities[i].a;
    }
    pref[aNum - 1] = sum;
    for (int i = aNum; i < n; ++i)
    {
        sum += cities[i].a;
        a.insert(cities[i].a);
        sum -= *a.begin();
        a.erase(a.begin());
        pref[i] = sum;
    }
    sum = 0;
    multiset<int> b;
    for (int i = 1; i <= bNum; ++i)
    {
        b.insert(cities[n - i].b);
        sum += cities[n - i].b;
    }
    suff[n - bNum] = sum;
    for (int i = bNum + 1; i <= n; ++i)
    {
        sum += cities[n - i].b;
        b.insert(cities[n - i].b);
        sum -= *b.begin();
        b.erase(b.begin());
        suff[n - i] = sum;
    }
    long long ans = 0;
    for (int i = 0; i + 1 < n; ++i)
        ans = max(ans, pref[i] + suff[i + 1]);
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...