제출 #1224237

#제출 시각아이디문제언어결과실행 시간메모리
1224237guagua0407던전 (IOI21_dungeons)C++20
63 / 100
7162 ms1663848 KiB
#pragma GCC optimize("Ofast") #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 ll inf=(ll)1e18; const int k=7; int N; int S[mxn]; int P[mxn]; int W[mxn]; int L[mxn]; int id[mxn]; struct node{ ll sum; ll 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-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=merge(c,st[cur][t]); } } 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) { 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]; } W[N]=N; L[N]=N; for(int i=0;i<N;i++){ id[i]=__lg(S[i]); } id[N]=k; 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(28-1,(int)__lg(z)); t=(t/4); //cout<<"st "<<x<<' '<<z<<'\n'; tie(x,z)=G[t].solve(x,z); //cout<<"en "<<x<<' '<<z<<'\n'; 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...