제출 #1331286

#제출 시각아이디문제언어결과실행 시간메모리
1331286AndreyCake 3 (JOI19_cake3)C++20
0 / 100
2 ms3396 KiB
#include<bits/stdc++.h>
using namespace std;

vector<long long> haha(200001);
vector<long long> bruh(200001);
long long n;

pair<long long,long long> calc(long long lamb) {
    long long ans = 0,ans2 = 0;
    vector<long long> pr(n+1);
    vector<long long> br(n+1);
    for(long long i = 1; i <= n; i++) {
        pr[i] = pr[i-1]-bruh[i]+bruh[i-1];
        br[i] = br[i-1];
        if(i > 1 && haha[i-1]+lamb > 0) {
            br[i]++;
            pr[i]+=haha[i-1]+lamb;
        }
    }
    long long sb = 0,x = 0,sm = 0,big = 0;
    for(long long i = 1; i <= n; i++) {
        sb-=bruh[i]-bruh[i-1];
        if(haha[i]+lamb > 0) {
            x++;
            sb+=haha[i]+lamb;
        }
        if(i > 1) {
            long long a = sb-sm,b = x-big;
            if(a > ans || (a == ans && b < ans2)) {
                ans = a;
                ans2 = b;
            }
        }
        if(pr[i] < sm || (pr[i] == sm && br[i] > big)) {
            sm = pr[i];
            big = br[i];
        }
    }
    return {ans,ans2};
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    long long m,a,b;
    cin >> n >> m;
    vector<pair<long long,long long>> wut(0);
    for(long long i = 0; i < n; i++) {
        cin >> a >> b;
        b*=2;
        wut.push_back({b,a});
    }
    sort(wut.begin(),wut.end());
    for(long long i = 1; i <= n; i++) {
        haha[i] = wut[i-1].second;
        bruh[i] = wut[i-1].first;
    }
    long long l = -10000000000LL,r = 10000000000LL;
    while(l < r) {
        long long mid = (l+r+1)/2;
        pair<long long,long long> c = calc(mid);
        if(c.second <= m) {
            l = mid;
        }
        else {
            r = mid-1;
        }
    }
    pair<long long,long long> c = calc(l);
    pair<long long,long long> d = calc(l+1);
    long long x1 = c.second,x2 = d.second;
    long long y1 = c.first-x1*l,y2 = d.first-x2*(l+1);
    if(x1 == m) {
        cout << y1;
    }
    else {
        long long s = (y2-y1)/(x2-x1);
        cout << y1+(m-x1)*s;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...