Submission #1304634

#TimeUsernameProblemLanguageResultExecution timeMemory
1304634polishprogrammerSemiexpress (JOI17_semiexpress)C++20
100 / 100
2 ms584 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
#define lld long double

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ll n, m, k, a, b, c, t;
    cin >> n >> m >> k >> a >> b >> c >> t;
    vector<ll> arr(m);
    for (ll i = 0; i < m; i++) cin >> arr[i];
    ll nk = k - m;
    priority_queue<pair<pair<ll, ll>, pair<ll, ll>>> pq; // {{zysk, miejsce}, {pop, nas}}
    ll wyn = 0;
    for (ll i = 1; i < m; i++) {
        ll pop = arr[i - 1], nas = arr[i], dl = nas - pop, czas = (pop - 1) * b;
        if (czas > t) break;
        ll poz = t - czas, d = poz / a, dod = min(d, dl - 1);
        wyn += dod;
        if (d < dl - 1) {
            ll miejsce = pop + d + 1;
            czas += (miejsce - pop) * c;
            if (czas <= t) {
                ll d2 = (t - czas) / a, zysk = min(nas - miejsce, d2 + 1);
                pq.push({{zysk, miejsce}, {pop, nas}});
            }
        }
        if ((nas - 1) * b <= t) wyn++;
    }
    while (nk > 0 && !pq.empty()) {
        pair<pair<int, int>, pair<int, int>> p = pq.top();
        pq.pop();
        ll zysk = p.fi.fi, miejsce = p.fi.se, pop = p.se.fi, nas = p.se.se;
        wyn += zysk;
        miejsce += zysk;
        if (miejsce < nas) {
            ll czas = (pop - 1) * b + (miejsce - pop) * c;
            if (czas <= t) {
                ll d2 = (t - czas) / a;
                pq.push({{min(nas - miejsce, d2 + 1), miejsce}, {pop, nas}});
            }
        }
        nk--;
    }
    cout << wyn << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...