제출 #650764

#제출 시각아이디문제언어결과실행 시간메모리
650764iulia13Valley (BOI19_valley)C++14
100 / 100
493 ms43308 KiB
#include <bits/stdc++.h>

using namespace std;
#define ll long long
const int N = 1e5 + 5;
const int LG = 20;
const ll inf = 1e16;
struct ura{
    int x; ll c;
};
struct ura2{
    int x, y;
} edges[N];
vector <ura> g[N];
int n, s, q, e;
int h[N];
ll d[N];
int dad[N][LG];
ll dpmini[N][LG];
int shop[N];
ll mini[N];
void dfs(int nod)
{
    mini[nod] = inf;
    if (shop[nod])
        mini[nod] = d[nod];
    for (auto p : g[nod])
    {
        int x = p.x;
        ll c = p.c;
        if (x == dad[nod][0])
            continue;
        dad[x][0] = nod;
        h[x] = h[nod] + 1;
        d[x] = d[nod] + c;
        dfs(x);
        mini[nod] = min(mini[nod], mini[x]);
    }
}
void lifting()
{
    for (int j = 1; j <= 19; j++)
    {
        for (int i = 1; i <= n; i++)
        {
            dad[i][j] = dad[dad[i][j - 1]][j - 1];
            dpmini[i][j] = min(dpmini[i][j - 1], dpmini[dad[i][j - 1]][j - 1]);
        }
    }
}
int main()
{
    cin >> n >> s >> q >> e;
    for (int i = 1; i < n; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        g[a].push_back({b, c});
        g[b].push_back({a, c});
        edges[i] = {a, b};
    }
    for (int i = 1; i <= s; i++)
    {
        int c;
        cin >> c;
        shop[c] = 1;
    }
    dfs(e);
    for (int i = 1; i <= n; i++)
    {
        dpmini[i][0] = inf;
        if (mini[i] != inf)
        dpmini[i][0] = mini[i] = mini[i] - 2 * d[i];

    }
    lifting();
    while(q--)
    {
        int ind, r;
        cin >> ind >> r;
        int a = edges[ind].x;
        int b = edges[ind].y;
        if (h[a] < h[b])
            swap(a, b);
        ///verific daca r e in subarb a
        int lg = 19; ll ans = inf;
        b = r;
        if (ind == 6)
            ind = 6;
        while (h[a] != h[b] && lg != -1)
        {
            if (h[dad[b][lg]] >= h[a])
            {
                ans = min(ans, dpmini[b][lg]);
                b = dad[b][lg];
            }
            lg--;
        }
        if (b != a)
        {
            cout << "escaped" << '\n';
            continue;
        }
        ans = min(ans, dpmini[b][0]);
        if (ans == inf)
            cout << "oo\n";
        else
            cout << ans + d[r] << '\n';
    }
    return 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...