제출 #842368

#제출 시각아이디문제언어결과실행 시간메모리
842368Dec0DeddCake 3 (JOI19_cake3)C++14
100 / 100
1081 ms222364 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pii; const int N = 2e5+10; const ll INF = 1e18; struct Vertex { Vertex *l, *r; pii val; Vertex(pii x) : l(nullptr), r(nullptr), val(x) {} Vertex(Vertex *l, Vertex *r) : l(l), r(r), val({0, 0}) { if (l) val.first+=l->val.first, val.second+=l->val.second; if (r) val.first+=r->val.first, val.second+=r->val.second; } }; Vertex* build(int l, int r) { if (l == r) return new Vertex(make_pair(0, 0)); int m=(l+r)/2; return new Vertex(build(l, m), build(m+1, r)); } Vertex* upd(Vertex* v, int l, int r, int p, ll nvl) { if (l == r) { return new Vertex(make_pair(v->val.first+nvl, v->val.second+1)); } int m=(l+r)/2; if (p <= m) return new Vertex(upd(v->l, l, m, p, nvl), v->r); return new Vertex(v->l, upd(v->r, m+1, r, p, nvl)); } ll que(Vertex* vl, Vertex *vr, int l, int r, int x) { if (l == r) { ll k=vr->val.second-vl->val.second, sm=vr->val.first-vl->val.first; assert(k >= x); return (sm/k)*x; } int m=(l+r)/2, rcnt=vr->r->val.second-vl->r->val.second; if (rcnt >= x) return que(vl->r, vr->r, m+1, r, x); return que(vl->l, vr->l, l, m, x-rcnt)+(vr->r->val.first-vl->r->val.first); } ll n, m, dp[N]; vector<pii> x; set<int> st; map<int, int> sc; pii mx(pii a, pii b) { if (a.first > b.first) return a; if (b.first > a.first) return b; if (a.first == b.first) { if (a.second < b.second) return a; return b; } } vector<Vertex*> rts; void solve(int l, int r, int opl, int opr) { if (l > r) return; int md=(l+r)/2; pii tmp={-INF, n}; for (int i=max(1ll*opl, md+m-1); i<=opr; ++i) { assert(i-md+1 >= m); ll q=que(rts[md], rts[i-1], 1, n, m-2); tmp=mx(tmp, {q+x[i-1].second+x[md-1].second-2*abs(x[i-1].first-x[md-1].first), i}); } dp[md]=tmp.first; solve(l, md-1, opl, tmp.second), solve(md+1, r, tmp.second, opr); } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); cin>>n>>m; for (int i=1; i<=n; ++i) { ll v, c; cin>>v>>c; x.push_back({c, v}); st.insert(v); } sort(x.begin(), x.end()); int i=1; for (auto u : st) sc[u]=i++; rts.push_back(build(1, n)); for (int i=1; i<=n; ++i) { rts.push_back(upd(rts.back(), 1, n, sc[x[i-1].second], x[i-1].second)); } solve(1, n-m+1, 1, n); ll ans=-INF; for (int i=1; i<=n-m+1; ++i) ans=max(ans, dp[i]); cout<<ans<<"\n"; }

컴파일 시 표준 에러 (stderr) 메시지

cake3.cpp: In function 'pii mx(pii, pii)':
cake3.cpp:59:1: warning: control reaches end of non-void function [-Wreturn-type]
   59 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...