Submission #379031

#TimeUsernameProblemLanguageResultExecution timeMemory
379031leinad2Cake 3 (JOI19_cake3)C++17
100 / 100
1397 ms124268 KiB
#include<bits/stdc++.h> using namespace std; struct node { int l, r, v; long long sum; }nd; node pst[5000010]; pair<int, int>A[200010]; map<int, int>x, y; map<int, int>::iterator it; int t, n, q, a, b, c, d, i, j, sz, m, rt, cnt, root[200010], opt[200010], X[200010], Y[200010]; long long dap=-1e18; void make_node(){pst[sz++]={-1, -1, 0, 0};} void init(int id, int s, int e) { if(s==e)return; int m=s+e>>1; if(pst[id].l==-1) { pst[id].l=sz; make_node(); } init(pst[id].l, s, m); if(pst[id].r==-1) { pst[id].r=sz; make_node(); } init(pst[id].r, m+1, e); } void update(int prev, int id, int s, int e, int x) { pst[id].v=pst[prev].v+1; pst[id].sum=pst[prev].sum+Y[x]; if(s==e)return; int m=s+e>>1; if(x<=m) { pst[id].l=sz; make_node(); pst[id].r=pst[prev].r; update(pst[prev].l, pst[id].l, s, m, x); } else { pst[id].r=sz; make_node(); pst[id].l=pst[prev].l; update(pst[prev].r, pst[id].r, m+1, e, x); } } long long get(int prev, int id, int s, int e, int k) { if(s==e)return min(k, (int)(pst[id].sum-pst[prev].sum)/Y[s])*Y[s]; long long d=pst[pst[id].r].sum-pst[pst[prev].r].sum; int ee=pst[pst[id].r].v-pst[pst[prev].r].v; int m=s+e>>1; if(k<=ee)return get(pst[prev].r, pst[id].r, m+1, e, k); else return d+get(pst[prev].l, pst[id].l, s, m, k-ee); } void dnc(int s, int e, int l, int r) { if(s>e)return; int mid=s+e>>1; long long ans=-1e18; int pos; for(int i=max(l, mid+m-1);i<=r;i++) { long long res=get(root[mid], root[i-1], 1, cnt, m-2)+Y[A[mid].second]+Y[A[i].second]-(X[A[i].first]-X[A[mid].first]); if(ans<res) { ans=res; pos=i; } } dap=max(dap, ans); opt[mid]=pos; dnc(s, mid-1, l, pos); dnc(mid+1, e, pos, r); } main() { for(scanf("%d %d", &n, &m);i++<n;) { scanf("%d %d", &b, &a); a*=2; A[i].first=a,A[i].second=b; x[a]++;y[b]++; } sort(A+1, A+n+1); for(it=x.begin();it!=x.end();it++)it->second=++cnt,X[cnt]=it->first;cnt=0; for(it=y.begin();it!=y.end();it++)it->second=++cnt,Y[cnt]=it->first; make_node(); init(0, 1, cnt); for(i=0;i++<n;) { A[i].first=x[A[i].first]; A[i].second=y[A[i].second]; root[i]=sz; make_node(); update(root[i-1], root[i], 1, cnt, A[i].second); } dnc(1, n-m+1, 1, n); cout<<dap; }

Compilation message (stderr)

cake3.cpp: In function 'void init(int, int, int)':
cake3.cpp:18:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   18 |     int m=s+e>>1;
      |           ~^~
cake3.cpp: In function 'void update(int, int, int, int, int)':
cake3.cpp:37:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |     int m=s+e>>1;
      |           ~^~
cake3.cpp: In function 'long long int get(int, int, int, int, int)':
cake3.cpp:58:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   58 |     int m=s+e>>1;
      |           ~^~
cake3.cpp: In function 'void dnc(int, int, int, int)':
cake3.cpp:65:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   65 |     int mid=s+e>>1;
      |             ~^~
cake3.cpp: At global scope:
cake3.cpp:82:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   82 | main()
      |      ^
cake3.cpp: In function 'int main()':
cake3.cpp:92:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   92 |     for(it=x.begin();it!=x.end();it++)it->second=++cnt,X[cnt]=it->first;cnt=0;
      |     ^~~
cake3.cpp:92:73: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   92 |     for(it=x.begin();it!=x.end();it++)it->second=++cnt,X[cnt]=it->first;cnt=0;
      |                                                                         ^~~
cake3.cpp:84:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   84 |     for(scanf("%d %d", &n, &m);i++<n;)
      |         ~~~~~^~~~~~~~~~~~~~~~~
cake3.cpp:86:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   86 |         scanf("%d %d", &b, &a);
      |         ~~~~~^~~~~~~~~~~~~~~~~
cake3.cpp: In function 'void dnc(int, int, int, int)':
cake3.cpp:79:8: warning: 'pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
   79 |     dnc(s, mid-1, l, pos);
      |     ~~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...