Submission #1225717

#TimeUsernameProblemLanguageResultExecution timeMemory
1225717guagua0407Dungeons Game (IOI21_dungeons)C++20
25 / 100
7055 ms1115912 KiB
#pragma GCC optimize("O4,unroll-loops,no-stack-protector") #pragma GCC target("avx,avx2,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,fma") #include "dungeons.h" //#include "grader.cpp" #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define f first #define s second #define all(x) x.begin(),x.end() #define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); namespace{ const int mxn=4e5+5; const int inf=1e9; const int k=7; int N; vector<int> S,P,W,L; struct node{ ll sum; int mn; int nxt; }; inline node merge(node &a,node &b){ node c; c.sum=a.sum+b.sum; c.nxt=b.nxt; c.mn=min(a.mn,(b.mn==inf?inf:max(0,(int)(b.mn-a.sum)))); return c; } struct graph{ int bound; node st[mxn][25]; inline void build(int _bound){ bound=_bound; for(int i=0;i<=N;i++){ st[i][0].nxt=(S[i]>=bound?L[i]:W[i]); st[i][0].sum=(S[i]>=bound?P[i]:S[i]); if(S[i]>bound or i==N){ st[i][0].mn=S[i]; } else{ st[i][0].mn=inf; } } for(int j=1;j<25;j++){ for(int i=0;i<=N;i++){ st[i][j]=merge(st[i][j-1],st[st[i][j-1].nxt][j-1]); } } } inline pair<int,ll> solve(int x,ll z){ if(z>=S[x]){ return {x,z}; } node c; c.sum=(S[x]>=bound?P[x]:S[x]); c.nxt=(S[x]>=bound?L[x]:W[x]); c.mn=inf; for(int t=24;t>=0;t--){ int cur=c.nxt; if(z+c.sum<st[cur][t].mn){ c.nxt=st[cur][t].nxt; c.sum+=st[cur][t].sum; } } int cur=c.nxt; z+=c.sum; return make_pair(cur,z); } }; graph G[k]; } void init(int _n, std::vector<int> _S, std::vector<int> _P, std::vector<int> _w, std::vector<int> _l) { auto st=clock(); N=_n; S=_S; P=_P; W=_w; L=_l; S.push_back(0); P.push_back(0); W.push_back(N); L.push_back(N); for(int i=0;i<k;i++){ G[i].build(1<<(i*4)); } return; } long long simulate(int x, int Z) { ll z=Z; //cout<<'\n'; while(x!=N){ int t=min(k-1,(int)__lg(z)/4); tie(x,z)=G[t].solve(x,z); if(x==N) return z; if(z>=S[x]){ z+=S[x]; x=W[x]; } else{ z+=P[x]; x=L[x]; } if(x==N) return z; } return z; }
#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...