제출 #1162681

#제출 시각아이디문제언어결과실행 시간메모리
1162681brinton도로 폐쇄 (APIO21_roads)C++20
컴파일 에러
0 ms0 KiB
#include "jumps.h"

#include <bits/stdc++.h>
using namespace std;
#define inf 1000000
vector<vector<int>> edges;
vector<int> H;
vector<vector<int>> big,small;
int N;
int k;
void init(int iN, std::vector<int> iH) {
  N = iN;
  H = iH;
  // create DAG using monotic array
  stack<int> st;
  edges.resize(N+1);
  // create front
  for(int i = 0;i < N;i++){
    while(!st.empty() && st.top() < H[i]){
      st.pop();
    }
    
    if(!st.empty()){
      edges[H[i]].push_back(st.top());
    }
    st.push(H[i]);
  }

  while(!st.empty()) st.pop();
  // from back
  for(int i = N-1;i >= 0;i--){
    while(!st.empty() && st.top() < H[i]){
      st.pop();
    }
    
    if(!st.empty()){
      edges[H[i]].push_back(st.top());
    }
    st.push(H[i]);
  }

  for(auto &i:edges){
    if(i.size() == 0){
      i.push_back(-1);
      i.push_back(-1);
      continue;
    }
    if(i.size() == 1){
      i.push_back(i[0]);
      continue;
    }
    if(i[0] < i[1]) swap(i[0],i[1]);
  }
  // edges[0] -> big, edges[1] -> small
  //create edges ok, lets create binary jump
  k = __lg(N);
  big = small = vector<vector<int>>(k+1,vector<int>(N+1,0));
  // zero layer
  for(int i = 1;i <= N;i++){
    big[0][i] = edges[i][0];
    small[0][i] = edges[i][1];
  }
  for(int l = 1;l <= k;l++){
    for(int i = 1;i <= N;i++){
      if(big[l-1][i] == -1){
        big[l][i] = -1;
      }else{
        // cout << l-1 << " " << i << ":" << big[l-1][i] << endl;
        big[l][i] = big[l-1][big[l-1][i]];
      }
      if(small[l-1][i] == -1){
        small[l][i] = -1;
      }else{
        small[l][i] = small[l-1][small[l-1][i]];
      }
    }
  }
  // for(int l = 0;l <= k;l++){
  //   for(int i = 1;i <= N;i++){
  //     cout << big[l][i] << " ";
  //   }
  //   cout << endl;
  // }
  // for(int l = 0;l <= k;l++){
  //   for(int i = 1;i <= N;i++){
  //     cout << small[l][i] << " ";
  //   }
  //   cout << endl;
  // }
}

int minimum_jumps(int A, int B, int C, int D) {
  // A == B and C == D
  int cnt = 0;
  int cur = H[A];
  // cout << k << " " << cur << endl;
  // cout << big.size() << " " << big[0].size() << endl;
  for(int l = k;l >= 0;l--){
    if(big[l][cur] != -1 && big[l][cur] <= H[C]){
      cur = big[l][cur];
      cnt+=(1 << l);
    }
  }
  for(int l = k;l >= 0;l--){
    if(small[l][cur] != -1 && small[l][cur] <= H[C]){
      cur = small[l][cur];
      cnt+=(1 << l);
    }
  }
  if(cur != H[C]){
    return -1;
  }else{
    return cnt;
  }
}

// grader

// #include "jumps.h"

// #include <cassert>
// #include <cstdio>

// #include <vector>

// int main() {
//   int N, Q;
//   assert(2 == scanf("%d %d", &N, &Q));
//   std::vector<int> H(N);
//   for (int i = 0; i < N; ++i) {
//     assert(1 == scanf("%d", &H[i]));
//   }
//   init(N, H);

//   for (int i = 0; i < Q; ++i) {
//     int A, B, C, D;
//     assert(4 == scanf("%d %d %d %d", &A, &B, &C, &D));
//     printf("%d\n", minimum_jumps(A, B, C, D));
//   }
//   return 0;
// }

컴파일 시 표준 에러 (stderr) 메시지

roads.cpp:1:10: fatal error: jumps.h: No such file or directory
    1 | #include "jumps.h"
      |          ^~~~~~~~~
compilation terminated.