제출 #1329467

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

#define int long long
const int maxn = 2e5 + 5;
struct node{
    int l, r, cnt, sum;
} st[maxn * 40];
int root[maxn], cnt = 0;
vector<int> cmp;
int upd(int p, int l, int r, int pos, int val){
    int cur = ++cnt;
    st[cur] = st[p];
    st[cur].cnt++;
    st[cur].sum += val;
    if(l == r) return cur;
    int mid = (l + r) / 2;
    if(pos <= mid) st[cur].l = upd(st[p].l, l, mid, pos, val);
    else st[cur].r = upd(st[p].r, mid + 1, r, pos, val);
    return cur;
}

int query(int u, int v, int l, int r, int k) {
    if(k <= 0) return 0;
    if(l == r) return k * cmp[l - 1];
    int mid = (l + r) / 2, rcnt = st[st[v].r].cnt - st[st[u].r].cnt;
    if(k <= rcnt) return query(st[u].r, st[v].r, mid + 1, r, k);
    return st[st[v].r].sum - st[st[u].r].sum + query(st[u].l, st[v].l, l, mid, k - rcnt);
}
bool maximize(int &a, int b){
    if(a <= b){
        a = b;
        return true;
    }
    return false;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    int n, m; cin >> n >> m;

    vector<array<int, 2>> a(n + 1);
    for(int i = 1; i <= n; i++) cin >> a[i][1] >> a[i][0]; //v = 1, c = 0;
    sort(a.begin() + 1, a.end());
    
    for(int i = 1; i <= n; i++) cmp.push_back(a[i][1]);
    sort(cmp.begin(), cmp.end());
    cmp.erase(unique(cmp.begin(), cmp.end()), cmp.end());
    
    for(int i = 1; i <= n; i++) root[i] = upd(root[i - 1], 1, cmp.size(), lower_bound(cmp.begin(), cmp.end(), a[i][1]) - cmp.begin() + 1, a[i][1]);
    
    auto cost = [&](int i, int j){
        return a[i][1] + a[j][1] - 2 * (a[j][0] - a[i][0]) + query(root[i], root[j - 1], 1, cmp.size(), m - 2);
    };

    int ans = -1e18;
    function<void(int, int, int, int)> solve = [&](int l, int r, int optl, int optr){
        int mid = (l + r) / 2, opt = optl, mx = -1e18;
        
        for(int i = optl; i <= min(optr, mid - m + 1); i++){
            if(maximize(mx, cost(i, mid))) opt = i;
        }
        
        ans = max(ans, mx);
        
        if(l < mid) solve(l, mid - 1, optl, opt);
        if(mid < r) solve(mid + 1, r, opt, optr);
    };
    solve(m, n, 1, n - m + 1);
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...