Submission #884058

#TimeUsernameProblemLanguageResultExecution timeMemory
884058andrei_boacaMeetings (IOI18_meetings)C++17
19 / 100
5584 ms539276 KiB
#include "meetings.h" #include <bits/stdc++.h> //#include "grader.cpp" using namespace std; typedef long long ll; int iteration; ll n,q,v[750005],rmq[21][750005]; ll loga[750005]; vector<ll> sol; ll best(ll i,ll j) { if(v[i]>v[j]) return i; if(v[j]>v[i]) return j; if(iteration==1) return max(i,j); else return min(i,j); } ll getbest(ll l,ll r) { ll lg=loga[r-l+1]; return best(rmq[lg][l],rmq[lg][r-(1<<lg)+1]); } struct query { ll r,ind,cst; }; vector<query> who[750005]; struct interv { ll st,dr,a,b; }; vector<deque<interv>> s; vector<ll> lazy; ll eval(ll me, ll poz) { ll st=0; ll dr=s[me].size(); dr--; while(st<=dr) { ll mij=(st+dr)/2; if(s[me][mij].st>poz) { dr=mij-1; continue; } if(s[me][mij].dr<poz) { st=mij+1; continue; } ll val=s[me][mij].a*poz+s[me][mij].b+lazy[me]; return val; } } ll cntnodes=0; int plsnode() { cntnodes++; if(s.size()<=cntnodes) { s.resize(cntnodes+1); lazy.resize(cntnodes+1); } s[cntnodes].clear(); lazy[cntnodes]=0; return cntnodes; } int nrop=0; int build(int l,int r) { ll poz=getbest(l,r); ll hv=v[poz]; //node *nod = new node; ll nod=0; ll nodl=0; ll nodr=0; if(l<=poz-1) nodl=build(l,poz-1); if(r>=poz+1) nodr=build(poz+1,r); ll valmij=0; if(nodl==0) { valmij=v[poz]; nodl=plsnode(); } else valmij=eval(nodl,poz-1)+v[poz]; s[nodl].push_back({poz,poz,0,valmij-lazy[nodl]}); ll off=hv*(poz-l+1); if(nodr==0) { nod=nodl; for(auto i:who[l]) { ll rgt=i.r; ll ind=i.ind; ll cst=i.cst; if(rgt<=r) { ll val=eval(nod,rgt)+cst; sol[ind]=min(sol[ind],val); } } return nod; } valmij-=hv*poz; lazy[nodr]+=off; while(!s[nodr].empty()) { interv a=s[nodr].front(); ll p=a.dr; ll val1=valmij+hv*p; ll val2=a.a*p+a.b+lazy[nodr]; if(val1<=val2) { s[nodr].pop_front(); continue; } else { ll st=a.st; ll dr=a.dr; ll j=st-1; while(st<=dr) { ll mij=(st+dr)/2; val1=valmij+hv*mij; val2=a.a*mij+a.b+lazy[nodr]; if(val1<=val2) { j=mij; st=mij+1; } else dr=mij-1; } s[nodr].pop_front(); a.st=j+1; s[nodr].push_front(a); interv add={poz+1,j,hv,valmij-lazy[nodr]}; if(add.st<=add.dr) s[nodr].push_front(add); break; } } if(s[nodr].empty()) s[nodr].push_back({poz+1,r,hv,valmij-lazy[nodr]}); ll rez=0; if(s[nodl].size()>s[nodr].size()) { ll dif=lazy[nodr]-lazy[nodl]; rez=nodr; while(!s[nodl].empty()) { interv a=s[nodl].back(); s[nodl].pop_back(); a.b-=dif; s[rez].push_front(a); if(iteration==1) nrop++; } } else { ll dif=lazy[nodl]-lazy[nodr]; rez=nodl; while(!s[nodr].empty()) { interv a=s[nodr].front(); s[nodr].pop_front(); a.b-=dif; s[rez].push_back(a); if(iteration==1) nrop++; } } for(auto i:who[l]) { ll rgt=i.r; ll ind=i.ind; ll cst=i.cst; if(rgt<=r) { ll val=eval(rez,rgt)+cst; sol[ind]=min(sol[ind],val); } } return rez; } vector<long long> minimum_costs(vector<int> H, vector<int> L, vector<int> R) { n=H.size(); q=L.size(); sol.resize(q); iteration=1; for(int i=1;i<=n;i++) { v[i]=H[i-1]; for(int bit=0;bit<=20;bit++) if((1<<bit)<=i) loga[i]=bit; } for(int i=0;i<q;i++) { sol[i]=1e17; L[i]++; R[i]++; } for(int i=n;i>=1;i--) { rmq[0][i]=i; for(int j=1;j<=20;j++) { rmq[j][i]=rmq[j-1][i]; int poz=i+(1<<(j-1)); if(poz<=n) rmq[j][i]=best(rmq[j][i],rmq[j-1][poz]); } } for(int i=0;i<q;i++) { ll poz=getbest(L[i],R[i]); ll cst=(poz-L[i]+1)*v[poz]; if(poz+1<=R[i]) who[poz+1].push_back({R[i],i,cst}); else sol[i]=min(sol[i],cst); } cntnodes=0; build(1,n); iteration=2; reverse(v+1,v+n+1); for(int i=1;i<=n;i++) who[i].clear(); for(int i=0;i<q;i++) { L[i]=n-L[i]+1; R[i]=n-R[i]+1; swap(L[i],R[i]); } for(int i=n;i>=1;i--) { rmq[0][i]=i; for(int j=1;j<=20;j++) { rmq[j][i]=rmq[j-1][i]; int poz=i+(1<<(j-1)); if(poz<=n) rmq[j][i]=best(rmq[j][i],rmq[j-1][poz]); } } for(int i=0;i<q;i++) { ll lft=L[i]; ll rgt=R[i]; ll poz=getbest(L[i],R[i]); ll cst=(poz-L[i]+1)*v[poz]; if(poz+1<=R[i]) who[poz+1].push_back({R[i],i,cst}); else sol[i]=min(sol[i],cst); } cntnodes=0; build(1,n); return sol; }

Compilation message (stderr)

meetings.cpp: In function 'int plsnode()':
meetings.cpp:63:16: warning: comparison of integer expressions of different signedness: 'std::vector<std::deque<interv> >::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   63 |     if(s.size()<=cntnodes)
      |        ~~~~~~~~^~~~~~~~~~
meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:259:12: warning: unused variable 'lft' [-Wunused-variable]
  259 |         ll lft=L[i];
      |            ^~~
meetings.cpp:260:12: warning: unused variable 'rgt' [-Wunused-variable]
  260 |         ll rgt=R[i];
      |            ^~~
meetings.cpp: In function 'll eval(ll, ll)':
meetings.cpp:58:1: warning: control reaches end of non-void function [-Wreturn-type]
   58 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...