제출 #120911

#제출 시각아이디문제언어결과실행 시간메모리
120911youngyojunCake 3 (JOI19_cake3)C++11
100 / 100
1173 ms15180 KiB
#include <bits/stdc++.h> #define eb emplace_back #define sz(V) ((int)(V).size()) #define allv(V) ((V).begin()),((V).end()) #define sorv(V) sort(allv(V)) #define upmax(a,b) (a)=max((a),(b)) #define INFLL (0x3f3f3f3f3f3f3f3fll) using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef pair<ll, int> pli; const bool debug = 0; const int MAXN = 200055; struct SEG { ll ds[MAXN*4]; int dc[MAXN*4]; void push(int i, int s, int e, int x, ll r) { ds[i] += r; dc[i]++; if(s == e) return; int m = (s+e) >> 1; if(x <= m) push(i<<1, s, m, x, r); else push(i<<1|1, m+1, e, x, r); } void pop(int i, int s, int e, int x, ll r) { ds[i] -= r; dc[i]--; if(s == e) return; int m = (s+e) >> 1; if(x <= m) pop(i<<1, s, m, x, r); else pop(i<<1|1, m+1, e, x, r); } ll get(int i, int s, int e, int c) { if(!c) return 0; if(dc[i] == c) return ds[i]; int m = (s+e) >> 1; if(c <= dc[i<<1]) return get(i<<1, s, m, c); else return get(i<<1, s, m, dc[i<<1]) + get(i<<1|1, m+1, e, c - dc[i<<1]); } } seg; int PQs, PQe; ll A[MAXN], B[MAXN]; int AO[MAXN], ARO[MAXN]; ll Ans = -INFLL; int N, M; void f(int s, int e) { for(; s < PQs;) { PQs--; seg.push(1, 1, N, ARO[PQs], A[PQs]); } for(; PQe < e;) { PQe++; seg.push(1, 1, N, ARO[PQe], A[PQe]); } for(; PQs < s;) { seg.pop(1, 1, N, ARO[PQs], A[PQs]); PQs++; } for(; e < PQe;) { seg.pop(1, 1, N, ARO[PQe], A[PQe]); PQe--; } } void f(int s, int e, int p, int q) { if(s > e || p > q) return; int m = (s+e) >> 1; ll hc = -INFLL; int hi = -1; for(int i = max(m+M+1, p); i <= q; i++) { f(m+1, i-1); ll ret = seg.get(1, 1, N, M) + A[m] + B[m] + A[i] - B[i]; if(ret <= hc) continue; hc = ret; hi = i; } if(debug) { printf("F %d %d %d %d / %d %lld %d\n", s, e, p, q, m, hc, hi); } upmax(Ans, hc); f(s, m-1, p, hi); f(m+1, e, hi, q); } int main() { ios::sync_with_stdio(false); cin >> N >> M; M -= 2; { vector<pll> V; for(int i = 0, a, b; i < N; i++) { cin >> a >> b; V.eb(b << 1, a); } sorv(V); for(int i = 1; i <= N; i++) tie(B[i], A[i]) = V[i-1]; } iota(AO, AO+N+1, 0); sort(AO+1, AO+N+1, [&](int a, int b) { return A[a] > A[b]; }); for(int i = 1; i <= N; i++) ARO[AO[i]] = i; PQs = PQe = 1; seg.push(1, 1, N, ARO[1], A[1]); if(debug) { for(int i = 1; i <= N; i++) printf("%d ; %d %lld %lld\n", i, ARO[i], A[i], B[i]); } f(1, N-M-1, 1, N); cout << Ans << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...