제출 #144236

#제출 시각아이디문제언어결과실행 시간메모리
144236osaaateiasavtnlCake 3 (JOI19_cake3)C++14
100 / 100
1460 ms206304 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define ii pair <int, int>
#define app push_back
#define all(a) a.begin(), a.end()
#define bp __builtin_popcount
const int N = 2e5 + 7, INF = 1e18 + 7;
int n, m;
struct El { int v, c; } a[N];
struct Node { int cnt, sum; Node *l, *r; Node () { cnt = sum = 0; l = r = NULL; } };
vector <int> c;
Node *build(int tl, int tr) {
    Node *ans = new Node();
    if (tl == tr) return ans;
    int tm = (tl + tr) >> 1;
    ans->l = build(tl, tm); ans->r = build(tm + 1, tr);
    return ans;
}
void relax(Node *t) { t->cnt = t->l->cnt + t->r->cnt; t->sum = t->l->sum + t->r->sum; }
Node *add(Node *t, int tl, int tr, int p) {
    Node *ans = new Node();
    if (tl == tr) { ans->cnt = t->cnt + 1; ans->sum = t->sum + c[p]; return ans; }
    int tm = (tl + tr) >> 1;
    if (p <= tm) { ans->l = add(t->l, tl, tm, p); ans->r = t->r; }
    else { ans->l = t->l; ans->r = add(t->r, tm + 1, tr, p); }
    relax(ans); return ans;
}
int get(Node *l, Node *r, int tl, int tr, int k) {
    if (tl == tr) return c[tl] * k;
    int tm = (tl + tr) >> 1;
    int t = r->r->cnt - l->r->cnt;
    if (k <= t) return get(l->r, r->r, tm + 1, tr, k);
    else return get(l->l, r->l, tl, tm, k - t) + (r->r->sum - l->r->sum);
}
Node *t[N];
int get(int l, int r) {
    return get(t[l - 1], t[r], 0, N, m) - 2 * (a[r].c - a[l].c); 
}
int ans = -INF;
int get(int i, int l, int r) {
    int best = -INF, pos = l;
    for (int j = l; j <= r && m <= i - j + 1; ++j) {
        int nn = get(j, i);
        if (best < nn) { best = nn; pos = j; }
    }
    ans = max(ans, best);
    return pos;
}
void solve(int l, int r, int ll, int rr) {
    if (r < l) return;
    int m = (l + r) >> 1; int mm = get(m, ll, rr);
    if (l == r) return;
    solve(l, m - 1, ll, mm); solve(m + 1, r, mm, rr);
}
bool comp(El a, El b) { return a.c < b.c; }
signed main() {
    #ifdef HOME
    freopen("input.txt", "r", stdin);
    #else
    ios_base::sync_with_stdio(0); cin.tie(0);
    #endif
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) { cin >> a[i].v >> a[i].c; c.app(a[i].v); }
    sort(c.begin(), c.end()); c.resize(unique(all(c)) - c.begin());
    sort(a + 1, a + n + 1, comp);
    t[0] = build(0, N);
    for (int i = 1; i <= n; ++i) {
        t[i] = add(t[i - 1], 0, N, lower_bound(c.begin(), c.end(), a[i].v) - c.begin());
    }
    solve(1, n, 1, n); cout << ans << '\n';
}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...