제출 #1124148

#제출 시각아이디문제언어결과실행 시간메모리
1124148njoop쌀 창고 (IOI11_ricehub)C++17
17 / 100
0 ms328 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

int n;
vector<int> arr;

ll cost(int k) {
    multiset<ll> s1, s2;
    ll mnco = 1e18, su1=0, su2=0, mxl=0, mnr=0, med=0;
    for(int i=1; i<=n; i++) {
        if(i > k) {
            if(s1.find(arr[i-k]) != s1.end()) {
                s1.erase(s1.find(arr[i-k]));
                su1 -= arr[i-k];
            } else {
                s2.erase(s2.find(arr[i-k]));
                su2 -= arr[i-k];
            }
        }
        if(s1.size() <= s2.size()) {
            s1.insert(arr[i]);
            su1 += arr[i];
        } else {
            s2.insert(arr[i]);
            su2 += arr[i];
        }
        if(s1.size() && s2.size() && *s1.rbegin() > *s2.begin()) {
            mxl = *s1.rbegin();
            mnr = *s2.begin();
            su1 += mnr - mxl;
            su2 += mxl - mnr;
            s1.insert(mnr);
            s1.erase(s1.find(mxl));
            s2.insert(mxl);
            s2.erase(s2.find(mnr));
        }
        if(i > k-1) {
            med = *s1.rbegin();
            ll co = s1.size()*med - su1 + su2 - s2.size()*med;
            mnco = min(mnco, co);
        }
    }
    return mnco;
}

int besthub(int R, int L, int X[], long long B) {
    n=R;
    arr.assign(R+10, 0);
    for(int i=1; i<=R; i++) {
        arr[i] = X[i-1];
    }
    int l=1, r=R;
    while(l < r) {
        int mid = (l+r)/2;
        if(cost(mid) > B) {
            r = mid;
        } else {
            l = mid+1;
        }
    }
    return l-1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...