제출 #1089322

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

#define int long long

const int N = 200005;
const int M = 6e6 + 5;
const int INF = 1e18;

int n, m, ans = -INF, node = 1, sz;
pair<int, int> p[N];
int rt[M], ls[M], rs[M], cnt[M], sum[M];
vector<int> disc;

int update(int root, int ori, int pos, int l, int r) {
    ++node;
    int x = node;
    ls[x] = ls[root], rs[x] = rs[root], cnt[x] = cnt[root] + 1, sum[x] = sum[root] + ori;
    // cout << "update: " << ori << " " << l << " " << r << " node: " << x << '\n';
    if (l == r) return x;
    int mid = (l + r) / 2;
    if (pos <= mid) ls[x] = update(ls[x], ori, pos, l, mid);
    else rs[x] = update(rs[x], ori, pos, mid + 1, r);
    return x;
}

int query(int ql, int qr, int k, int l, int r) {
    // cout << "enter: " << ql << " " << qr << " " << k << " " << l << " " << r << '\n';
    if (!k) return 0;
    if (l == r) return disc[l - 1] * k;
    int mid = (l + r) / 2;
    int lc = cnt[rs[qr]] - cnt[rs[ql]];
    // cout << "lc: " << lc << '\n';
    if (lc > k) return query(rs[ql], rs[qr], k, mid + 1, r);
    return sum[rs[qr]] - sum[rs[ql]] + query(ls[ql], ls[qr], k - lc, l, mid);
}

int qry(int l, int r) {
    // cout << l << " " << r - 1 << " " << m - 2 << " " << 1 << " " << sz << '\n';
    int res = query(rt[l], rt[r - 1], m - 2, 1, sz);
    // cout << "res: " << res << '\n';
    return (p[l].second - p[r].second) * 2 + p[l].first + p[r].first + res;
}

void dnc(int l, int r, int optl, int optr) {
    // cout << "dnc: " << l << " " << r <<'\n';
    if (l > r) return;
    int mid = (l + r) / 2;
    int opt = optr, mx = -INF;
    for (int i = max(mid + m - 1, optl); i <= optr; i++) {
        // cout << "query: " << mid << " " << i << '\n';
        int res = qry(mid, i);
        // cout << "returned " << res << '\n';
        if (opt == -1) opt = i, mx = res;
        else if (res > mx) opt = i, mx = res;
    }
    ans = max(ans, mx);
    dnc(l, mid - 1, optl, opt);
    dnc(mid + 1, r, opt, optr);
}

int32_t main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> p[i].first >> p[i].second;
        disc.push_back(p[i].first);
    }
    sort(disc.begin(), disc.end());
    disc.erase(unique(disc.begin(), disc.end()), disc.end());
    sort(p + 1, p + n + 1, [] (auto x, auto y) { return x.second < y.second; });
    rt[0] = 1;
    sz = disc.size();
    for (int i = 1; i <= n; i++) {
        int pos = lower_bound(disc.begin(), disc.end(), p[i].first) - disc.begin() + 1;
        rt[i] = update(rt[i - 1], p[i].first, pos, 1, sz);
    }
    dnc(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...