Submission #969308

#TimeUsernameProblemLanguageResultExecution timeMemory
969308vjudge1Pyramid Base (IOI08_pyramid_base)C++17
80 / 100
5053 ms120312 KiB
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize("Ofast") #define N 1<<19 int S[4*N],B[4*N],n,m,p,b,A[N],B2[N],C[N],D[N],W[N],STUFF[2*N],SMTH[2*N],SMTH2[2*N]; void reset(int i,int l,int r){ S[i]=B[i]=0; if(l==r) return void(STUFF[l]=i); reset(i*2,l,l+r>>1); reset(i*2+1,l+r+2>>1,r); } void add(int pos,int x){ pos=STUFF[pos]; S[pos]=B[pos]+=x; pos/=2; while(pos){ S[pos]=S[pos*2]+S[pos*2+1]; B[pos]=min(B[pos*2],B[pos*2+1]+S[pos*2]); pos/=2; } } vector<pair<int,int>>pref[2*N]; bool check(int k){ for(int i=0;i<p;i++){ int a=max(1,A[i]-k+1); int b=max(1,B2[i]-k+1); pref[a].push_back({b,W[i]}); if(D[i]<=m-k+1) pref[a].push_back({D[i],-W[i]}); if(C[i]<=n-k+1) pref[C[i]].push_back({b,-W[i]}),SMTH[C[i]]=1; if(D[i]<=m-k+1&&C[i]<=n-k+1) pref[C[i]].push_back({D[i],W[i]}); SMTH[a]=1; } reset(1,1,m-k+1); int ans=0; if(!SMTH[1]) ans=1; else for(int i=1;i<n-k+2;i++){ if(SMTH[i]) { for(auto [x,w]:pref[i]) SMTH2[x]+=w; for(auto [x,w]:pref[i]) if(SMTH2[x]) { w=STUFF[x]; S[w]=B[w]+=SMTH2[x]; SMTH2[x]=0; w/=2; while(w){ S[w]=S[w*2]+S[w*2+1]; B[w]=min(B[w*2],B[w*2+1]+S[w*2]); w/=2; } } } if(B[1]<=b) { ans=1; break; } } for(int i=1;i<=n-k+2;i++) if(SMTH[i]) pref[i].clear(), SMTH[i]=0; return ans; } int read(){ int res=0; char c=getchar(); while(c<'0'||c>'9') c=getchar(); while(47<c&&c<58) res=res*10+c-48,c=getchar(); return res; } signed main(){ //long long XXX=chrono::steady_clock::now().time_since_epoch().count(); cin>>n>>m>>b>>p; b=min(b,1<<28); for(int i=0;i<p;i++) A[i]=read(),B2[i]=read(),C[i]=read(),D[i]=read(),W[i]=read(),C[i]++,D[i]++; if(!b) for(int i=0;i<p;i++) W[i]=1; int l=0,r=min(n,m); while(l<r){ int mid=l+r+1>>1; if(check(mid)) l=mid; else r=mid-1; cerr<<"DONE1\n"; } cout<<l<<'\n'; //long long YYY=chrono::steady_clock::now().time_since_epoch().count(); //cerr<<fixed<<setprecision(10)<<"Took: "<<(YYY-XXX)/1e9<<'s'; }

Compilation message (stderr)

pyramid_base.cpp: In function 'void reset(int, int, int)':
pyramid_base.cpp:9:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    9 |     reset(i*2,l,l+r>>1);
      |                 ~^~
pyramid_base.cpp:10:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   10 |     reset(i*2+1,l+r+2>>1,r);
      |                 ~~~^~
pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:87:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   87 |         int mid=l+r+1>>1;
      |                 ~~~^~
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...