제출 #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...