Submission #1349210

#TimeUsernameProblemLanguageResultExecution timeMemory
1349210AndreyScarecrows 2 (JOI26_scarecrows)C++20
100 / 100
502 ms7860 KiB
#include<bits/stdc++.h>
using namespace std;

pair<long long,long long> calc(vector<pair<pair<long long,long long>,long long>>& wut, long long lamb) {
    priority_queue<long long> idk;
    priority_queue<long long> banana;
    long long n = wut.size();
    long long ans = 0,br = 0;
    for(long long i = 0; i < n; i++) {
        long long c = wut[i].second;
        if(wut[i].first.second == 0) {
            idk.push(-c);
        }
        else {
            long long x = 1,y = 1;
            if(!idk.empty()) {
                x = -idk.top()+c-lamb;
            }
            if(!banana.empty()) {
                y = c-banana.top();
            }
            if(min(x,y) >= 0) {
                continue;
            }
            if(x < y) {
                idk.pop();
                ans+=x;
                br++;
                banana.push(c);
            }
            else {
                banana.pop();
                banana.push(c);
                ans+=y;
            }
        }
    }
    return {ans,br};
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    long long n,k;
    cin >> n >> k;
    vector<pair<pair<long long,long long>,long long>> a(0);
    vector<pair<pair<long long,long long>,long long>> b(0);
    for(long long i = 0; i < n; i++) {
        long long t,x,y,c;
        cin >> t >> x >> y >> c;
        if(t == 1) {
            a.push_back({{x,1},c});
        }
        else if(t == 2) {
            a.push_back({{x,0},c});
        }
        else if(t == 3) {
            b.push_back({{y,1},c});
        }
        else {
            b.push_back({{y,0},c});
        }
    }
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    long long c = calc(a,1000000000000LL).second,d = calc(b,1000000000000LL).second;
    if(c+d < k) {
        cout << -1;
        return 0;
    }
    long long l = 0,r = 1000000000000LL;
    while(l < r) {
        long long mid = (l+r+1)/2;
        long long w = calc(a,mid).second+calc(b,mid).second;
        if(w > k) {
            r = mid-1;
        }
        else {
            l = mid;
        }
    }
    pair<long long,long long> y1 = calc(a,l);
    pair<long long,long long> y2 = calc(b,l);
    pair<long long,long long> z1 = calc(a,l+1);
    pair<long long,long long> z2 = calc(b,l+1);
    pair<long long,long long> y = {y1.first+y2.first,y1.second+y2.second},z = {z1.first+z2.first,z1.second+z2.second};
    y = {y.first+y.second*l,y.second};
    z = {z.first+z.second*(l+1),z.second};
    if(y.second == k) {
        cout << y.first;
        return 0;
    }
    long long dif =  (z.first-y.first)/(z.second-y.second);
    long long ans = y.first+(k-y.second)*dif;
    cout << ans;
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...