Submission #1252112

#TimeUsernameProblemLanguageResultExecution timeMemory
12521123m17Valley (BOI19_valley)C++20
23 / 100
253 ms55948 KiB
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define fi first
#define se second
#define int long long

const int Nmax = 5e5 + 174;
const int LogN = 18;

int n , q , S , E;
int u[Nmax] , v[Nmax];
int par[Nmax][18] , AnsMin[Nmax][18];
int dep[Nmax] , dp[Nmax] , dist[Nmax];
int times , inp[Nmax] , out[Nmax];
bool Shop[Nmax];

vector <pair<int , int>> graph[Nmax];

void DFS(int u)
{
    if(Shop[u]) dp[u] = dist[u];
    inp[u] = ++times;
    for (pair <int , int> v : graph[u])
    if(par[u][0] != v.first)
    {
        par[v.first][0] = u;
        dist[v.first] = dist[u] + v.second;
        dep[v.first] = dep[u] + 1;
        AnsMin[v.first][0] = dp[v.first] - 2 * dist[v.first];
        DFS(v.first);
        dp[u] = min(dp[v.first] , dp[u]);

        //dp[u] = min(dp[u] , dp[v.first]);
    }
    AnsMin[u][0] = dp[u] - 2 * dist[u];
    out[u] = times;
}

void Binary_Lifting()
{
    for (int i = 1 ; i <= 17 ; i++)
        for (int u = 1 ; u <= n ; u++)
        {
            par[u][i] = par[par[u][i - 1]][i - 1];
            AnsMin[u][i] = min(AnsMin[u][i] , AnsMin[par[u][i - 1]][i - 1]);
        }
}

int Get (int u , int x)
{
    int Ans = 1e15;
    for (int i = 17 ; i >= 0 ; i--)
    if(x & (1 << i))
    {
        x -= (1 << i);
        Ans = min(Ans , AnsMin[u][i]);
        u = par[u][i];
    }
    return Ans;
}

main(){
    cin >> n >> S >> q >> E;
    for (int i = 1 ; i < n ; i++)
    {
        int w;
        cin >> u[i] >> v[i] >> w;
        graph[u[i]].push_back({v[i] , w});
        graph[v[i]].push_back({u[i] , w});
    }

    for (int i = 1 ; i <= n ; i++) dp[i] = 1e15;
    for (int i = 1 ; i <= S ; i++)
    {
        int s;
        cin >> s;
        Shop[s] = true;
    }

    DFS(E);
    Binary_Lifting();

    //cout << AnsMin[7][0] << ' ' << AnsMin[7][1] << '\n';
    /*
    for (int i = 1 ; i <= n ; i++)
    cout << dp[i] << ' ' << AnsMin[i][0] << '\n';
    */
    for (int i = 1 ; i <= q ; i++)
    {
        int idx , R;
        cin >> idx >> R;
        int uSon = (dep[u[idx]] < dep[v[idx]] ? v[idx] : u[idx]);
        //cout << uSon << ' ';
        if(inp[uSon] <= inp[R] && out[R] <= out[uSon])
        {
            if(dp[uSon] == 1e15) cout << "oo" << '\n';
            else
            {
                if(!Shop[R]) cout << dist[R] + Get(R , dep[R] - dep[uSon] + 1) << '\n';
                else cout << 0 << '\n';
            }
        }
        else cout << "escaped" << '\n';
    }
}

Compilation message (stderr)

valley.cpp:63:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   63 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...