제출 #437518

#제출 시각아이디문제언어결과실행 시간메모리
437518QAQAutoMaton던전 (IOI21_dungeons)C++17
100 / 100
2768 ms775472 KiB
#include "dungeons.h" #include <vector> #include<bits/stdc++.h> using namespace std; #define int long long namespace ns{ int n,m; int s[400005],p[400005],w[400005],l[400005]; int toe[400005]; //int f[21][400005],g[21][400005],h[21][400005]; struct arr{ signed v[400005]; signed &operator [](int b){return v[b];} }; arr tb[505],*f[12],*g[12],*h[12],*las=tb; arr *neww(int n){ arr *ret=las;las+=n;return ret; } int a[400005]; const signed inf=0x3f3f3f3f; int pw[25]; void init(signed N, std::vector<signed> S, std::vector<signed> P, std::vector<signed> W, std::vector<signed> L) { n=N; for(int i=0;i<n;++i)s[i]=S[i],p[i]=P[i],w[i]=W[i],l[i]=L[i]; /*for(int i=0;i<n;++i)a[i+1]=s[i]; sort(a+1,a+n+1); m=unique(a+1,a+n+1)-a-1; for(int v=0;v<=m;++v){ for(int i=0;i<n;++i){ f[v][0][i]=(s[i]<=a[v]?w[i]:l[i]); g[v][0][i]=(s[i]<=a[v]?s[i]:p[i]); } f[v][0][n]=n;g[v][0][n]=0; for(int i=1;i<=30;++i)for(int j=0;j<=n;++j){ f[v][i][j]=f[v][i-1][f[v][i-1][j]]; g[v][i][j]=g[v][i-1][j]+g[v][i-1][f[v][i-1][j]]; } }*/ for(int i=n-1;~i;--i)toe[i]=s[i]+toe[w[i]]; for(int i=0;i<=12;++i)pw[i]=1<<(i+i); for(int v=0;v<12;++v){ f[v]=neww(v+v+2); g[v]=neww(v+v+2); h[v]=neww(v+v+2); for(int i=0;i<n;++i){ if(s[i]<pw[v]){ f[v][0][i]=w[i]; g[v][0][i]=s[i]; h[v][0][i]=inf; } else{ f[v][0][i]=l[i]; g[v][0][i]=p[i]; h[v][0][i]=s[i]; } } f[v][0][n]=n;g[v][0][n]=0;h[v][0][n]=inf; for(int i=1;i<=v+v+1;++i){ for(int j=0;j<=n;++j){ f[v][i][j]=f[v][i-1][f[v][i-1][j]]; g[v][i][j]=min(g[v][i-1][j]+g[v][i-1][f[v][i-1][j]],inf); h[v][i][j]=max(min(h[v][i-1][j],h[v][i-1][f[v][i-1][j]]-g[v][i-1][j]),-1); } } } /*for(int i=0;i<n;++i){ f[0][i]=w[i],g[0][i]=s[i],h[0][i]=s[i]; } f[0][n]=n;g[0][n]=h[0][n]=0; for(int i=1;i<=20;++i){ for(int j=0;j<=n;++j){ f[i][j]=f[i-1][f[i-1][j]]; g[i][j]=max(g[i-1][j],g[i-1][f[i-1][j]]-h[i-1][j]); h[i][j]=h[i-1][j]+h[i-1][f[i-1][j]]; } }*/ } long long simulate(int x, int z) { int rk=0; while(x<n){ if(z>=pw[rk+1]&&rk<12)++rk; if(rk==12){ return z+toe[x]; } for(int i=rk+rk+1;~i;--i){ if(z<h[rk][i][x] && g[rk][i][x]+z<pw[rk+1]){ z+=g[rk][i][x]; x=f[rk][i][x]; } } if(x<n){ if(z>=s[x]){ z+=s[x];x=w[x]; } else{ z+=p[x];x=l[x]; } } } return z; /*while(x<n){ for(int i=20;~i;--i){ if(z>=g[i][x]){ z+=h[i][x]; x=f[i][x]; } } if(x<n){ z+=p[x];x=l[x]; } }*/ /* if(z>=s[x]){ z+=s[x];x=w[x]; } else{ z+=p[x];x=l[x]; } }*/ return z ; } } void init(signed N, std::vector<signed> S, std::vector<signed> P, std::vector<signed> W, std::vector<signed> L) { ns::init(N,S,P,W,L); } long long simulate(signed x, signed z) { return ns::simulate(x,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...