Submission #1252604

#TimeUsernameProblemLanguageResultExecution timeMemory
1252604bachhoangxuanObstacles for a Llama (IOI25_obstacles)C++20
21 / 100
2100 ms87724 KiB
#include "obstacles.h" #include<bits/stdc++.h> using namespace std; const int LG=20; vector<int> a; vector<vector<int>> sl,sr,sn,ln,rn; void initialize(std::vector<int> T, std::vector<int> H) { int N=(int)T.size(),M=(int)H.size(); vector<int> mn(N),mx(N); for(int i=0;i<N;i++){ mn[i]=mx[i]=T[i]; if(i){ mn[i]=min(mn[i],mn[i-1]); mx[i]=max(mx[i],mx[i-1]); } } a.assign(M,-1); for(int i=0;i<M;i++){ int p=lower_bound(mn.begin(),mn.end(),H[i],[&](int x,int y){ return x>y; })-mn.begin(); if(p) a[i]=mx[p-1]; } vector<int> lt(M),rt(M); vector<pair<int,int>> v; for(int i=0;i<M;i++){ int val=H[i]; while(!v.empty() && H[v.back().first]>H[i]) val=max(val,v.back().second),v.pop_back(); lt[i]=i; if(!v.empty() && a[i]>val) lt[i]=v.back().first; v.push_back({i,val}); } v.clear(); for(int i=M-1;i>=0;i--){ int val=H[i]; while(!v.empty() && H[v.back().first]>=H[i]) val=max(val,v.back().second),v.pop_back(); rt[i]=i; if(!v.empty() && a[i]>val) rt[i]=v.back().first; v.push_back({i,val}); } vector<int> nxt(M); for(int i=0;i<M;i++){ if(lt[i]==i || rt[i]==i) nxt[i]=lt[i]^rt[i]^i; else{ pair<int,int> L={H[lt[i]],lt[i]},R={H[rt[i]],rt[i]}; if(L>R) nxt[i]=L.second; else nxt[i]=R.second; } } sl.assign(LG,vector<int>(M,0)); sr.assign(LG,vector<int>(M,0)); sn.assign(LG,vector<int>(M,0)); ln.assign(LG,vector<int>(M,0)); rn.assign(LG,vector<int>(M,0)); sl[0]=lt,sr[0]=rt,sn[0]=nxt; for(int i=0;i<M;i++) ln[0][i]=min(i,nxt[i]),rn[0][i]=max(i,nxt[i]); for(int i=1;i<LG;i++){ for(int j=0;j<M;j++){ sl[i][j]=sl[i-1][sl[i-1][j]]; sr[i][j]=sr[i-1][sr[i-1][j]]; sn[i][j]=sn[i-1][sn[i-1][j]]; ln[i][j]=min(ln[i-1][j],ln[i-1][sn[i-1][j]]); rn[i][j]=max(rn[i-1][j],rn[i-1][sn[i-1][j]]); } } } bool can_reach(int L, int R, int S,int D) { if(min(a[S],a[D])==-1) return false; auto f = [&](int A){ int lA=A,rA=A; for(int i=LG-1;i>=0;i--){ int nA=sn[i][A],nlA=min(lA,ln[i][A]),nrA=max(rA,rn[i][A]); if(L<=nlA && nrA<=R) A=nA,lA=nlA,rA=nrA; } for(int i=LG-1;i>=0;i--){ int nA=sl[i][A]; if(L<=nA) A=nA; } for(int i=LG-1;i>=0;i--){ int nA=sr[i][A]; if(nA<=R) A=nA; } return A; }; return f(S)==f(D); }
#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...