제출 #1003049

#제출 시각아이디문제언어결과실행 시간메모리
1003049irmuun던전 (IOI21_dungeons)C++17
13 / 100
96 ms22652 KiB
#include<bits/stdc++.h> #include "dungeons.h" using namespace std; #define ll long long #define pb push_back #define ff first #define ss second #define all(s) s.begin(),s.end() #define rall(s) s.rbegin(),s.rend() const int N=4e5+5; int n; vector<int>s,p,w,l,cnt; int nxt[N][30]; ll inc[N][30]; void init(int N,vector<int>S,vector<int>P,vector<int>W,vector<int>L){ n=N; s=S; p=P; w=W; l=L; cnt.resize(n+1); cnt[n]=0; for(int i=n-1;i>=0;i--){ cnt[i]=cnt[w[i]]+1; } nxt[n][0]=n; inc[n][0]=0; for(int i=0;i<n;i++){ nxt[i][0]=l[i]; inc[i][0]=p[i]; } for(int j=1;j<30;j++){ for(int i=0;i<=n;i++){ nxt[i][j]=nxt[nxt[i][j-1]][j-1]; inc[i][j]=inc[i][j-1]+inc[nxt[i][j-1]][j-1]; } } } bool check(int x,ll z,int u){ for(int j=29;j>=0;j--){ if(u&(1<<j)){ z+=inc[x][j]; x=nxt[x][j]; } } return (z>=s[0]||x==n); } void ADD(int &x,ll &z,int u){ for(int j=29;j>=0;j--){ if(u&(1<<j)){ z+=inc[x][j]; x=nxt[x][j]; } } } ll simulate(int x,int Z){ ll z=Z; ll L=0,R=(1<<29); while(L<R){ ll mid=(L+R)/2; if(check(x,z,mid)){ R=mid; } else{ L=mid+1; } } ADD(x,z,L); return z+(ll)cnt[x]*(ll)s[0]; }
#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...