제출 #1227746

#제출 시각아이디문제언어결과실행 시간메모리
1227746cpdreamer밀림 점프 (APIO21_jumps)C++20
0 / 100
79 ms24424 KiB
#include "jumps.h"

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
const long long INF = 1e17;
typedef long long ll;
const ll MOD = 1000002022;
#define F first
#define pb push_back
#define S second
#define P pair
#define V vector
#define all(v) v.begin(), v.end()
typedef tree<int,null_type,less<int>,rb_tree_tag, tree_order_statistics_node_update> indexed_multiset;
bool visited[(int)2e5+1];
int r[(int)2e5+1];
int in[(int)2e5+1];
int out[(int)2e5+1];
int dep[(int)2e5+1];
V<int>adj[(int)2e5+1];
int n;
int c=0;
void dfs(int n,int p,int d) {
    dep[n]=d;
    visited[n]=true;
    in[n]=c;
    for (auto u:adj[n]) {
        if (u==p)continue;
        c++;
        dfs(u,n,d+1);
    }
    out[n]=c;
    c++;
}
void init(int N, std::vector<int> H) {
    n=N;
    stack<int>st;
    for (int i=n-1;i>=0;i--) {
        while (!st.empty()) {
            if (H[st.top()]>H[i])break;
            st.pop();
        }
        if (st.empty()) {
            r[i]=-1;
        }
        else
            r[i]=st.top();
        st.push(i);
    }
    for (int i=0;i<n;i++) {
        if (r[i]!=-1) {
            adj[i].pb(r[i]);
            adj[r[i]].pb(i);
        }
    }
    for (int i=n-1;i>=0;i--) {
        if (visited[i])continue;
        dfs(i,-1,0);
    }
}

int minimum_jumps(int A, int B, int C, int D) {
    if (in[C]<=in[A] && in[A]<=out[C]) {
        return dep[A]-dep[C];
    }
    return -1;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...