제출 #546627

#제출 시각아이디문제언어결과실행 시간메모리
546627LoboCake 3 (JOI19_cake3)C++17
100 / 100
1305 ms202616 KiB
#include<bits/stdc++.h>
using namespace std;

const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
#define int long long
#define dbl long double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()

const int maxn = 2e5+10;
const int mxv = 1e9;

int n, m;
int trq[32*maxn], trs[32*maxn], f1[32*maxn], f2[32*maxn], st[maxn], perq = 0;
vector<pair<int,int>> cake;

int att(int no, int l, int r, int noant, int pos) {
    if(no == 0) no = ++perq;

    if(l == r) {
        trq[no]++;
        trs[no]+= pos;
        trq[no]+= trq[noant];
        trs[no]+= trs[noant];
        return no;
    }
    
    int mid = (l+r)/2;

    if(pos <= mid) {
        f1[no] = att(f1[no],l,mid,f1[noant],pos);
        f2[no] = f2[noant];
    }
    else {
        f2[no] = att(f2[no],mid+1,r,f2[noant],pos);
        f1[no] = f1[noant];
    }

    trq[no]= trq[f1[no]]+trq[f2[no]];
    trs[no]= trs[f1[no]]+trs[f2[no]];
    return no;
}

int find(int nol, int nor, int l, int r, int val) {
    if(l == r) {
        return val*l;
    }
    int mid = (l+r)/2;
    //vai pra direita
    if(val-(trq[f2[nor]]-trq[f2[nol]]) > 0) {
        return find(f1[nol],f1[nor],l,mid,val-(trq[f2[nor]]-trq[f2[nol]]))+trs[f2[nor]]-trs[f2[nol]];
    }
    else {
        return find(f2[nol],f2[nor],mid+1,r,val);
    }
}

int ans = -inf;
void dc(int l, int r, int opl, int opr) {
    if(l > r) return;
    int mx = -inf;
    int opt = -1;
    int mid = (l+r)/2;

    if(opr-mid+1 < m) {
        dc(l,mid-1,opl,opr);
        return;
    }

    for(int i = opl; i <= opr; i++) {
        if(i-mid+1 < m) continue;
        int qrr = find(mid == 0 ? 0 : st[mid-1],st[i],0,mxv,m) - 2*(cake[i].fr-cake[mid].fr);
    
        if(qrr > mx) {
            mx = qrr;
            opt = i;
        }
    }
    ans = max(ans, mx);
    dc(l,mid-1,opl,opt);
    dc(mid+1,r,opt,opr);
    
}

void solve() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        int v,c; cin >> v >> c;
        cake.pb(mp(c,v));
    }
    sort(all(cake));

    for(int i = 0; i < n; i++) {
        st[i] = att(0,0,mxv,i == 0 ? 0 : st[i-1],cake[i].sc);
    }

    dc(0,n-1,0,n-1);

    cout << ans << endl;

}

int32_t main() {
    ios::sync_with_stdio(false); cin.tie(0);

    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    
    int tt = 1;
    // cin >> tt;
    while(tt--) {
        solve();
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...