제출 #132856

#제출 시각아이디문제언어결과실행 시간메모리
132856dooweyCake 3 (JOI19_cake3)C++14
100 / 100
1562 ms20456 KiB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef pair<ll, ll> pii;
 
#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
 
const int N = (int)2e5 + 9;
const ll inf = (ll)1e18;
vector<ll> best;
ll c[N];
ll v[N];
int m;

struct Node{
    ll cnt;
    ll sum;
};

Node T[N * 4 + 512];
int k;
void update(int node, int cl, int cr, int p, ll v){
    T[node].cnt += v;
    T[node].sum += v * 1ll * best[p];
    if(cl == cr){
        return;
    }
    int mid = (cl + cr) / 2;
    if(mid >= p)
        update(node * 2, cl, mid, p, v);
    else
        update(node * 2 + 1, mid + 1, cr, p, v);
}

ll ask(int node, int cl, int cr, int x){
    if(cl == cr){
        return best[cl] * x;
    }
    int mid = (cl + cr) / 2;
    if(T[node * 2 + 1].cnt >= x){
        return ask(node * 2 + 1, mid + 1, cr, x);
    }
    else{
        return ask(node * 2, cl, mid, x - T[node * 2 + 1].cnt) + T[node * 2 + 1].sum;
    }
}

int L = 0, R = -1;

void go(int l, int r){
    while(L < l){
        update(1, 0, k - 1, v[L], -1);
        L ++ ;
    }
    while(L > l){
        L -- ;
        update(1, 0, k - 1, v[L], +1);
    }
    while(R < r){
        R ++ ;
        update(1, 0, k - 1, v[R], +1);
    }
    while(R > r){
        update(1, 0, k - 1, v[R], -1);
        R -- ;
    }
}

ll res = -inf;

void solve(int cl, int cr, int optl, int optr){
    if(cl > cr)
        return;
    int mid = (cl + cr) / 2;
    ll cur=0;
    int opt = -1;
    ll bes = -inf;
    for(int i = optl ; i <= min(optr, mid - m + 1); i ++ ){
        go(i, mid);
        cur = ask(1, 0, k - 1, m) - (c[mid] - c[i]);
        res = max(res, cur);
        if(cur > bes){
            bes = cur;
            opt = i;
        }
    }
    solve(cl, mid - 1, optl, opt);
    solve(mid + 1, cr, opt, optr);
}

int main(){
    fastIO;
    int n;
    cin >> n >> m;
    pii vv[n];
    for(int i = 0 ; i < n; i ++ ){
        cin >> vv[i].se >> vv[i].fi;
        vv[i].fi *= 2ll;
        best.push_back(vv[i].se);
    }
    sort(best.begin(), best.end());
    best.resize(unique(best.begin(), best.end()) - best.begin());
    k = best.size();
    sort(vv, vv + n);
    for(int i = 0 ; i < n; i ++ ){
        c[i] = vv[i].fi;
        v[i] = lower_bound(best.begin(), best.end(), vv[i].se) - best.begin();
    }
    solve(m - 1, n - 1, 0, n - 1);
    cout << res << "\n";
    return 0;   
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...