Submission #1188747

#TimeUsernameProblemLanguageResultExecution timeMemory
1188747turnejaShopping Plans (CCO20_day2problem3)C++17
25 / 25
2150 ms47304 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

#define endl "\n"
#define IOS ios_base::sync_with_stdio(false); cin.tie(nullptr);

using ll = long long;

const int N = 2e5 + 5;
const long long INF = 1e18;

struct Group {
    vector<int> a;
    int l;
    int r;
    int diff;
};

vector<Group> ta;
vector<Group> a;
vector<int> diff_arr[N];
vector<long long> pref[N];

bool comp(Group &a, Group &b) {
    return a.diff < b.diff;
}

vector<long long> solve(long long mx, long long s, int k) {
    int ct = 1;
    vector<long long> sorted{s};
    priority_queue<tuple<long long, int, int, int, int>> pq;
    if (a[0].l == 0) {
        long long val = s + a[0].a[0];
        if (val <= mx && ct + pq.size() < k) {
            pq.push(make_tuple(-val, 0, 0, 1, 1));
        }
    } else {
        long long val = s + a[0].diff;
        if (val <= mx && ct + pq.size() < k) {
            pq.push(make_tuple(-val, 0, a[0].l, 1, 1));
        }
        for (int i = 2; i <= a[0].l && ct + pq.size() < k; i++) {
            long long val = s + pref[0][a[0].l - 1] - ((a[0].l - 1 - i == -1) ? 0 : pref[0][a[0].l - 1 - i]);
            if (val <= mx) {
                pq.push(make_tuple(-val, 0, a[0].l, i, 0));
            } else {
                break;
            }
        }
        val = s + a[0].a[a[0].l];
        if (val <= mx && ct + pq.size() < k && a[0].l + 1 <= a[0].r) {
            pq.push(make_tuple(-val, 0, a[0].l, a[0].l + 1, 0));
        }
    }
    while (pq.size() && ct < k) {
        auto [s, g, j, sz, first] = pq.top();
        s = -s;
        pq.pop();
        ct++;
        sorted.push_back(s);
        if (j != a[g].a.size() - 1) {
            for (int i = 1; i <= sz && ct + pq.size() < k; i++) {
                long long val = s + pref[g][j] - ((j - i == -1) ? 0 : pref[g][j - i]);
                if (val <= mx) {
                    pq.push(make_tuple(-val, g, j + 1, i, 0));
                } else {
                    break;
                }
            }
            if (j + 1 == sz) {
                long long val = s + a[g].a[j + 1];
                if (val <= mx && ct + pq.size() < k && sz + 1 <= a[g].r) {
                    pq.push(make_tuple(-val, g, j + 1, sz + 1, 0));
                }
            }
        }

        if (g != a.size() - 1) {
            if (a[g + 1].l == 0) {
                long long val = s + a[g + 1].a[0];
                if (val <= mx && ct + pq.size() < k) {
                    pq.push(make_tuple(-val, g + 1, 0, 1, 1));
                }
            } else {
                long long val = s + a[g + 1].diff;
                if (val <= mx && ct + pq.size() < k) {
                    pq.push(make_tuple(-val, g + 1, a[g + 1].l, 1, 1));
                }
                for (int i = 2; i <= a[g + 1].l && ct + pq.size() < k; i++) {
                    long long val = s + pref[g + 1][a[g + 1].l - 1] - ((a[g + 1].l - 1 - i == -1) ? 0 : pref[g + 1][a[g + 1].l - 1 - i]);
                    if (val <= mx) {
                        pq.push(make_tuple(-val, g + 1, a[g + 1].l, i, 0));
                    } else {
                        break;
                    }
                }
                val = s + a[g + 1].a[a[g + 1].l];
                if (val <= mx && ct + pq.size() < k && a[g + 1].l + 1 <= a[g + 1].r) {
                    pq.push(make_tuple(-val, g + 1, a[g + 1].l, a[g + 1].l + 1, 0));
                }
            }

        }

        if (g != a.size() - 1 && first) {
            if (a[g + 1].l == 0) {
                long long val = s + a[g + 1].a[0] - a[g].diff;
                if (val <= mx && ct + pq.size() < k) {
                    pq.push(make_tuple(-val, g + 1, 0, 1, 1));
                }
            } else {
                long long val = s + a[g + 1].diff - a[g].diff;
                if (val <= mx && ct + pq.size() < k) {
                    pq.push(make_tuple(-val, g + 1, a[g + 1].l, 1, 1));
                }
                for (int i = 2; i <= a[g + 1].l && ct + pq.size() < k; i++) {
                    long long val = s + pref[g + 1][a[g + 1].l - 1] - ((a[g + 1].l - 1 - i == -1) ? 0 : pref[g + 1][a[g + 1].l - 1 - i]) - a[g].diff;
                    if (val <= mx) {
                        pq.push(make_tuple(-val, g + 1, a[g + 1].l, i, 0));
                    } else {
                        break;
                    }
                }
                val = s + a[g + 1].a[a[g + 1].l] - a[g].diff;
                if (val <= mx && ct + pq.size() < k && a[g + 1].l + 1 <= a[g + 1].r) {
                    pq.push(make_tuple(-val, g + 1, a[g + 1].l, a[g + 1].l + 1, 0));
                }
            }
        }
    }
    return sorted;
}

int main() {
    IOS;
    int n, m, k;
    cin >> n >> m >> k;
    ta.resize(m);
    for (int i = 0; i < n; i++) {
        int x, c;
        cin >> x >> c;
        x--;
        ta[x].a.push_back(c);
    }
    long long s = 0;
    for (int i = 0; i < m; i++) {
        cin >> ta[i].l >> ta[i].r;
        if (ta[i].r == 0) {
            continue;
        }
        ta[i].r = min(ta[i].r, (int)ta[i].a.size());
        if (ta[i].r < ta[i].l) {
            for (int j = 0; j < k; j++) {
                cout << -1 << endl;
            }
            return 0;
        }
        sort(ta[i].a.begin(), ta[i].a.end());
        for (int j = 0; j < ta[i].l; j++) {
            s += ta[i].a[j];
        }
        if (ta[i].l == ta[i].a.size()) {
            continue;
        }
        if (ta[i].l == 0) {
            ta[i].diff = ta[i].a[0];
        } else {
            ta[i].diff = ta[i].a[ta[i].l] - ta[i].a[ta[i].l - 1];
        }
        a.push_back(ta[i]);
    }
    sort(a.begin(), a.end(), comp);
    m = a.size();
    for (int i = 0; i < m; i++) {
        diff_arr[i].resize(a[i].a.size());
        pref[i].resize(a[i].a.size());
        for (int j = 0; j < a[i].a.size() - 1; j++) {
            diff_arr[i][j] = a[i].a[j + 1] - a[i].a[j];
            pref[i][j] = (j == 0 ? diff_arr[i][j] : pref[i][j - 1] + diff_arr[i][j]);
        }
    }

    long long mid = INF;
    vector<long long> ans = solve(mid, s, k);
    if (ans.size() < k) {
        sort(ans.begin(), ans.end());
        for (int i = 0; i < ans.size(); i++) {
            cout << ans[i] << endl;
        }
        for (int i = ans.size(); i < k; i++) {
            cout << -1 << endl;
        }
        return 0;
    }
    long long l = 1, r = 1e18, spl;
    ans = {};
    while (l <= r) {
        long long mid = (l + r) / 2;
        vector<long long> cur = solve(mid, s, k);
        if (cur.size() < k) {
            ans = cur;
            l = mid + 1;
        } else {
            r = mid - 1;
            spl = mid;
        }
    }
    sort(ans.begin(), ans.end());
    for (int i = 0; i < ans.size(); i++) {
        cout << ans[i] << endl;
    }
    for (int i = ans.size(); i < k; i++) {
        cout << spl << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...