제출 #1337916

#제출 시각아이디문제언어결과실행 시간메모리
1337916DeltaStruct던전 (IOI21_dungeons)C++20
100 / 100
3327 ms2044460 KiB
#include <bits/stdc++.h>
using namespace std;
#include "dungeons.h"

constexpr int m = 3;
array<vector<array<tuple<int,long long,long long>,24>>,(25+m-1)/m> table;
vector<int> E;

void init(int n,vector<int> A,vector<int> C,vector<int> B,vector<int> D){
  E = B;
  for (int i(0);i < (25+m-1)/m;++i){
    auto& tbl = table[i]; tbl.resize(n+1);
    tbl[n][0] = make_tuple(n,1e18,0);
    for (int k(0);k < n;++k){
      if (A[k]<=(1<<m*i)) tbl[k][0] = make_tuple(B[k],1e18,A[k]);
      else tbl[k][0] = make_tuple(D[k],A[k],C[k]);
    }
    for (int j(1);j < 24;++j) for (int k(0);k <= n;++k){
      auto [a,b,c] = tbl[k][j-1]; auto [d,e,f] = tbl[a][j-1];
      tbl[k][j] = make_tuple(d,min(b,e-c),c+f);
    }
  }
}

long long simulate(int x,int Y){
  int n = E.size();
  long long y(Y);
  for (int i(0);i < (25+m-1)/m;++i) while((1<<m*i)<=y&&y<(1<<m*(i+1))){
    auto& tbl = table[i];
    for (int l(23);l > -1;--l) if (get<0>(tbl[x][l])!=n&&get<1>(tbl[x][l])>y){
      y += get<2>(tbl[x][l]),x = get<0>(tbl[x][l]);
    }
    if (get<1>(tbl[x][0])>y&&get<0>(tbl[x][0])==n) return y+get<2>(tbl[x][0]);
    y += get<1>(tbl[x][0]),x = E[x];
    if (x==n) return y;
  }
  auto& tbl = table[24];
  for (int l(23);l > -1;--l) if (get<0>(tbl[x][l])!=n){
    y += get<2>(tbl[x][l]),x = get<0>(tbl[x][l]);
  }
  return y+get<2>(tbl[x][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...