Submission #786986

#TimeUsernameProblemLanguageResultExecution timeMemory
786986andrei_boacaRadio Towers (IOI22_towers)C++17
0 / 100
4073 ms193636 KiB
#include "towers.h" #include <bits/stdc++.h> //#include "stub.cpp" using namespace std; typedef pair<int,int> pii; int n; int v[100005]; int rmq[22][100005]; int loga[100005]; int lft[100005],rgt[100005]; int getmax(int l,int r) { int lg=loga[r-l+1]; return max(rmq[lg][l],rmq[lg][r-(1<<lg)+1]); } int getR(int poz,int delta) { int st=poz+2; int dr=n; int ans=1e9; while(st<=dr) { int mij=(st+dr)/2; if(getmax(poz+1,mij-1)-delta>=v[poz]) { ans=mij; dr=mij-1; } else st=mij+1; } return ans; } int getL(int poz,int delta) { bool ok=0; if(poz==4) ok=1; int st=1; int dr=poz-2; int ans=0; while(st<=dr) { int mij=(st+dr)/2; if(getmax(mij+1,poz-1)-delta>=v[poz]) { ans=mij; st=mij+1; } else dr=mij-1; } return ans; } int bin[22][100005]; int maxbin[22][22][100005]; int getmaxbin(int k,int l,int r) { if(r<=0) return 0; int lg=loga[r-l+1]; return max(maxbin[k][lg][l],maxbin[k][lg][r-(1<<lg)+1]); } void init(int N, std::vector<int> H) { n=N; for(int i=1;i<=n;i++) { v[i]=H[i-1]; for(int j=0;j<=20;j++) if((1<<j)<=i) loga[i]=j; } for(int i=n;i>=1;i--) { rmq[0][i]=v[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]=max(rmq[j][i],rmq[j-1][poz]); } } for(int i=1;i<=n;i++) { lft[i]=getL(i,1); bin[0][i]=lft[i]; for(int j=1;j<=20;j++) bin[j][i]=bin[j-1][bin[j-1][i]]; } for(int k=0;k<=20;k++) { for(int i=n;i>=1;i--) { maxbin[k][0][i]=lft[i]; for(int j=1;j<=20;j++) { maxbin[k][j][i]=maxbin[k][j-1][i]; int poz=i+(1<<(j-1)); if(poz<=n) maxbin[k][j][i]=max(maxbin[k][j][i],maxbin[k][j-1][poz]); } } } } int dp[100005]; int arb[4*100005]; vector<int> add[100005]; void update(int nod,int st,int dr,int poz,int val) { if(st==dr) { arb[nod]=val; return; } int mij=(st+dr)/2; if(poz<=mij) update(nod*2,st,mij,poz,val); else update(nod*2+1,mij+1,dr,poz,val); arb[nod]=max(arb[nod*2],arb[nod*2+1]); } int query(int nod,int st,int dr,int a,int b) { if(st>=a&&dr<=b) return arb[nod]; int mij=(st+dr)/2; int rez=0; if(a<=mij) rez=max(rez,query(nod*2,st,mij,a,b)); if(b>mij) rez=max(rez,query(nod*2+1,mij+1,dr,a,b)); return rez; } int max_towers(int L, int R, int D) { L++; R++; if(D==1) { int ans=1; int limit=L; for(int p=20;p>=0;p--) if(getmaxbin(p,L,R)>=limit) { ans+=(1<<p); L-=(1<<p); R-=(1<<p); L=max(L,1); } return ans; } for(int i=1;i<=4*n;i++) arb[i]=0; for(int i=1;i<=n;i++) add[i].clear(); int ans=1; for(int i=L;i<=R;i++) { for(int j:add[i]) update(1,1,n,j,dp[j]); dp[i]=1; int r=getR(i,D); int l=getL(i,D); if(l>=L) dp[i]=1+query(1,1,n,L,l); ans=max(ans,dp[i]); if(r<=R) add[r].push_back(i); } return ans; }

Compilation message (stderr)

towers.cpp: In function 'int getL(int, int)':
towers.cpp:36:10: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
   36 |     bool ok=0;
      |          ^~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...