Submission #1266309

#TimeUsernameProblemLanguageResultExecution timeMemory
1266309PlayVoltzCake 3 (JOI19_cake3)C++20
100 / 100
657 ms11380 KiB
#include <iostream> #include <map> #include <vector> #include <climits> #include <stack> #include <string> #include <queue> #include <algorithm> #include <set> #include <unordered_set> #include <iostream> #include <unordered_map> #include <cmath> #include <cctype> #include <bitset> #include <iomanip> #include <cstring> using namespace std; #define int long long #define pii pair<int, int> #define mp make_pair int n, m, ans=LLONG_MIN, R=1, L=1; vector<pii> vect, temp; vector <int> ft, disc, ft2; int query(int index){ int sum = 0; while (index>0){ sum+=ft[index]; index-= index & (-index); } return sum; } void update(int index, int val){ while (index<=n){ ft[index]+=val; index+=index&(-index); } } int query2(int index){ int sum = 0; while (index>0){ sum+=ft2[index]; index-= index & (-index); } return sum; } void update2(int index, int val){ while (index<=n){ ft2[index]+=val; index+=index&(-index); } } int f(int l, int r){ if (r-l+1<m)return LLONG_MIN/2; while (L>l)--L, update(disc[L], vect[L].second), update2(disc[L], 1); while (R<r)++R, update(disc[R], vect[R].second), update2(disc[R], 1); while (L<l)update(disc[L], -vect[L].second), update2(disc[L], -1), ++L; while (R>r)update(disc[R], -vect[R].second), update2(disc[R], -1), --R; int low=0, high=n+1; while (low+1<high){ int mid=(low+high)/2; if (query2(mid)<=m)low=mid; else high=mid; } return query(low); } void dnc(int l, int r, int optl, int optr){ if (l>r)return; int best=LLONG_MIN/2, opt=1, mid=(l+r)/2; for (int i=min(mid, optr); i>=optl; --i){ int res=f(i, mid)-2*(vect[mid].first-vect[i].first); if (res>best)best=res, opt=i; } ans=max(ans, best); dnc(l, mid-1, optl, opt); dnc(mid+1, r, opt, optr); } int32_t main(){ cin>>n>>m; vect.resize(n+1, mp(LLONG_MIN/2, LLONG_MIN/2)); disc.resize(n+1); ft.resize(n+1, 0); ft2.resize(n+1, 0); temp.resize(n); for (int i=1; i<=n; ++i)cin>>vect[i].second>>vect[i].first; sort(vect.begin(), vect.end()); for (int i=1; i<=n; ++i)temp[i-1]=mp(vect[i].second, i); sort(temp.begin(), temp.end(), greater<pii>()); for (int i=0; i<n; ++i)disc[temp[i].second]=i+1; L=R=temp[0].second; update(1, temp[0].first); update2(1, 1); dnc(1, n, 1, n); cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...