Submission #128297

#TimeUsernameProblemLanguageResultExecution timeMemory
128297mahmoudbadawyCake 3 (JOI19_cake3)C++17
0 / 100
12 ms8952 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> // Common file #include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update #define F first #define S second using namespace std; using namespace __gnu_pbds; typedef tree< pair<int,int>, null_type, greater<pair<int,int> >, rb_tree_tag, tree_order_statistics_node_update> ordered_set; const int N=100005; pair<int,int> arr[N]; long long diff[N],sdiff[N]; ordered_set ss; vector<int> upd[N]; int n,m; struct nodes{ long long val,lazy; nodes():val(0),lazy(0){} nodes(long long val):val(val),lazy(0){} }; nodes operator +(const nodes &l,const nodes &r) { nodes res; res.val=max(l.val,r.val); res.lazy=0; return res; } nodes btree[4*N]; void build(int node,int l,int r) { if(l==r) { btree[node]=nodes(sdiff[l]); return; } int mid=(l+r)/2; build(node*2,l,mid); build(node*2+1,mid+1,r); btree[node]=btree[node*2]+btree[node*2+1]; } void down(int node,int l,int r) { if(btree[node].lazy) { btree[node].val+=btree[node].lazy; if(l!=r) { btree[node*2].lazy+=btree[node].lazy; btree[node*2+1].lazy+=btree[node].lazy; } btree[node].lazy=0; } } void update(int node,int l,int r,int ind,long long val) { down(node,l,r); if(ind<l||ind>r) return; if(l==r) { btree[node]=nodes(btree[node].val+val); sdiff[l]+=val; return; } int mid=(l+r)/2; update(node*2,l,mid,ind,val); update(node*2+1,mid+1,r,ind,val); btree[node]=btree[node*2]+btree[node*2+1]; } void update(int node,int l,int r,int ql,int qr,long long val) { down(node,l,r); if(r<ql||qr<l) return; if(ql<=l&&r<=qr) { btree[node].lazy+=val; down(node,l,r); return; } int mid=(l+r)/2; update(node*2,l,mid,ql,qr,val); update(node*2+1,mid+1,r,ql,qr,val); btree[node]=btree[node*2]+btree[node*2+1]; } nodes query(int node,int l,int r,int ql,int qr) { down(node,l,r); if(r<ql||qr<l) return nodes(); if(ql<=l&&r<=qr) return btree[node]; int mid=(l+r)/2; return query(node*2,l,mid,ql,qr)+query(node*2+1,mid+1,r,ql,qr); } void update(int x,long long val) { update(1,0,n-1,0,x,val); } int main() { scanf("%d %d",&n,&m); for(int i=0;i<n;i++) { scanf("%d %d",&arr[i].S,&arr[i].F); arr[i].F*=2; } sort(arr,arr+n); long long cur=0,las=0; // val = maxk(arr[i].S,arr[j].S) - arr[i]. for(int i=n-1;i>=0;i--) { ss.insert({arr[i].S,i}); if(ss.order_of_key({arr[i].S,i})<m) { cur+=arr[i].S; if(ss.size()>m) cur-=(*ss.find_by_order(m)).F; } else { upd[ss.order_of_key({arr[i].S,i})].push_back(i); } diff[i]=cur-las+arr[i].F-arr[i+1].F; sdiff[i]=diff[i]+sdiff[i+1]; las=cur; //cout << cur << " " << arr[i].F << " " << arr[i+1].F << " " << diff[i] << endl; } build(1,0,n-1); int curp=m; long long ans=-(1LL<<60); for(int i=n-1;i>=m-1;i--) { //cout << query(1,0,n-1,i,i).val << " " << diff[i] << endl; ans=max(ans,query(1,0,n-1,0,i-m+1).val-arr[i].F); update(1,0,n-1,0,i-1,-arr[i].S); //update(1,0,n-1,0,i-1,-diff[i]); if(ss.order_of_key({arr[i].S,i})<m) { cur=0; for(int j:upd[curp]) { update(1,0,n-1,0,j,arr[j].S-cur); cur=arr[j].S; } curp++; } ss.erase({arr[i].S,i}); } printf("%lld\n",ans); }

Compilation message (stderr)

cake3.cpp: In function 'int main()':
cake3.cpp:130:35: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(ss.order_of_key({arr[i].S,i})<m)
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
cake3.cpp:133:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if(ss.size()>m)
       ~~~~~~~~~^~
cake3.cpp:154:35: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(ss.order_of_key({arr[i].S,i})<m)
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
cake3.cpp:118:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n,&m);
  ~~~~~^~~~~~~~~~~~~~~
cake3.cpp:121:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&arr[i].S,&arr[i].F);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...