Submission #633077

# Submission time Handle Problem Language Result Execution time Memory
633077 2022-08-21T14:49:18 Z a_aguilo Valley (BOI19_valley) C++14
59 / 100
3000 ms 30976 KB
#include<bits/stdc++.h>

using namespace std;

typedef vector<int> vi;
typedef vector<vi> vvi;

vi isShop, padre, level;
vector<pair<int, int>> edges;
vvi listaAdy, weights, dp;
int N, Q, E, S, LG;

void dfs(int nodo){
    for (int e = 0; e < listaAdy[nodo].size(); ++e){
        int vecino = listaAdy[nodo][e];
        int dist = weights[nodo][e];
        if(padre[nodo] == vecino) continue;
        padre[vecino] = nodo;
        level[vecino] = level[nodo]+1;
        dfs(vecino);
    }
}

int KthAncestor(int nodo, int K){
    for(int i = LG-1; i >= 0; --i){
        if((1 << i)<= K){
            K^=(1 << i);
            nodo = dp[nodo][i];
        }
    }
    return nodo;
}

void preprocess(){
    dfs(E);
    dp = vvi(N, vi(LG));
    for(int i = 0; i < N; ++i){
        dp[i][0] = padre[i];
    }
    for(int h = 1; h < LG; ++h){
        for(int nodo = 0; nodo < N; ++nodo){
            dp[nodo][h] = dp[dp[nodo][h-1]][h-1];
        }
    }
}

int getSon (pair<int, int> p){
    int a = p.first;
    int b = p.second;
    if (a == padre[b]) return b;
    return a;
}

long long dijkstra(int origin, pair<int, int> take){
    priority_queue<pair<long long int, pair<int, int>>> PQ;
    int u = take.first; int v = take.second;
    PQ.push({0, {origin, -1}});
    while(!PQ.empty()){
        pair<long long int, pair<int, int>> act;
        act = PQ.top(); PQ.pop();
        long long int dist = -1*act.first;
        int nodo = act.second.first;
        int padre = act.second.second;
        if(isShop[nodo]) return dist;
        for(int e = 0; e < listaAdy[nodo].size(); ++e){
            int vecino = listaAdy[nodo][e];
            int w = weights[nodo][e];
            if((vecino == u and nodo == v) or (vecino == v and nodo == u)) continue;
            if(vecino == padre) continue;
            PQ.push({-1*(dist+(long long)w), {vecino, nodo}});
        }
    }
    return -1;
}

int main(){
    cin >> N >> S >> Q >> E; E--;
    int a, b, w, I, R;
    LG = log2(N) + 2;
    listaAdy = vvi(N);
    weights = vvi(N);
    level = vi(N);
    padre = vi(N);
    padre[E] = E;
    level[E] = 0;
    isShop = vi(N, 0);
    for(int i = 1; i < N; ++i){
        cin >> a >> b >> w;
        a--; b--;
        edges.push_back({a, b});
        listaAdy[a].push_back(b);
        listaAdy[b].push_back(a);
        weights[a].push_back(w);
        weights[b].push_back(w);
    }
    for(int i = 0; i < S; ++i){
        cin >> a; a--;
        isShop[a] = 1;
    }
    preprocess();
    while(Q--){
        cin >> I >> R; I--; R--;
        int son = getSon(edges[I]);
        int d = level[R] - level[son];
        if(KthAncestor(R, d) != son){
            cout << "escaped" << endl;
            continue;
        }
        long long ans = dijkstra(R, edges[I]);
        if(ans == -1) cout << "oo" << endl;
        else cout << ans << endl;
    }
    return 0;
}

Compilation message

valley.cpp: In function 'void dfs(int)':
valley.cpp:14:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   14 |     for (int e = 0; e < listaAdy[nodo].size(); ++e){
      |                     ~~^~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:16:13: warning: unused variable 'dist' [-Wunused-variable]
   16 |         int dist = weights[nodo][e];
      |             ^~~~
valley.cpp: In function 'long long int dijkstra(int, std::pair<int, int>)':
valley.cpp:65:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |         for(int e = 0; e < listaAdy[nodo].size(); ++e){
      |                        ~~^~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 20 ms 420 KB Output is correct
2 Correct 18 ms 408 KB Output is correct
3 Correct 17 ms 444 KB Output is correct
4 Correct 17 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 420 KB Output is correct
2 Correct 18 ms 408 KB Output is correct
3 Correct 17 ms 444 KB Output is correct
4 Correct 17 ms 340 KB Output is correct
5 Correct 5 ms 468 KB Output is correct
6 Correct 4 ms 552 KB Output is correct
7 Correct 4 ms 468 KB Output is correct
8 Correct 3 ms 468 KB Output is correct
9 Correct 3 ms 440 KB Output is correct
10 Correct 4 ms 468 KB Output is correct
11 Correct 4 ms 440 KB Output is correct
12 Correct 4 ms 468 KB Output is correct
13 Correct 4 ms 468 KB Output is correct
14 Correct 18 ms 468 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 443 ms 28388 KB Output is correct
2 Correct 418 ms 27952 KB Output is correct
3 Correct 435 ms 27768 KB Output is correct
4 Correct 453 ms 29156 KB Output is correct
5 Correct 447 ms 29324 KB Output is correct
6 Correct 469 ms 30976 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 420 KB Output is correct
2 Correct 18 ms 408 KB Output is correct
3 Correct 17 ms 444 KB Output is correct
4 Correct 17 ms 340 KB Output is correct
5 Correct 5 ms 468 KB Output is correct
6 Correct 4 ms 552 KB Output is correct
7 Correct 4 ms 468 KB Output is correct
8 Correct 3 ms 468 KB Output is correct
9 Correct 3 ms 440 KB Output is correct
10 Correct 4 ms 468 KB Output is correct
11 Correct 4 ms 440 KB Output is correct
12 Correct 4 ms 468 KB Output is correct
13 Correct 4 ms 468 KB Output is correct
14 Correct 18 ms 468 KB Output is correct
15 Correct 443 ms 28388 KB Output is correct
16 Correct 418 ms 27952 KB Output is correct
17 Correct 435 ms 27768 KB Output is correct
18 Correct 453 ms 29156 KB Output is correct
19 Correct 447 ms 29324 KB Output is correct
20 Correct 469 ms 30976 KB Output is correct
21 Correct 473 ms 28756 KB Output is correct
22 Correct 618 ms 27876 KB Output is correct
23 Correct 2602 ms 27508 KB Output is correct
24 Execution timed out 3073 ms 27592 KB Time limit exceeded
25 Halted 0 ms 0 KB -