Submission #560085

# Submission time Handle Problem Language Result Execution time Memory
560085 2022-05-11T03:51:35 Z messiuuuuu Valley (BOI19_valley) C++14
100 / 100
265 ms 37172 KB
#include <bits/stdc++.h>
#define task "VALLEY"
#define ll long long
#define ld long double
#define fi first
#define se second
#define pb push_back
using namespace std;
const int MAXN = 1e5 + 5;
const ll INF = 1e18 + 5;
const int LOGN = 19;

int n, s, q, e;
vector<pair<int, int>> Adj[MAXN];
bool ishop[MAXN];
struct TEdge
{
    int u, v, w;
}es[MAXN];

void Input()
{
    cin >> n >> s >> q >> e;
    for (int i = 1; i < n; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        es[i] = {u, v, w};
        Adj[u].pb({v, w});
        Adj[v].pb({u, w});
    }
    for (int i = 1; i <= s; i++)
    {
        int c;
        cin >> c;
        ishop[c] = 1;
    }
}

ll dp[MAXN];
int P[MAXN][LOGN];
ll M[MAXN][LOGN], d[MAXN];
int deg[MAXN];

void DFS(int u, int par)
{
    if (!ishop[u])
        dp[u] = INF;
    for (auto v : Adj[u])
    {
        if (v.fi == par)
            continue;
        d[v.fi] = v.se + d[u];
        P[v.fi][0] = u;
        deg[v.fi] = deg[u] + 1;
        DFS(v.fi, u);
        dp[u] = min(dp[u], dp[v.fi] + v.se);
    }
}

void DFS2(int u, int par)
{
    for (auto v : Adj[u])
    {
        if (v.fi != par)
        {
            M[v.fi][0] = dp[u] - d[u];
            DFS2(v.fi, u);
        }
    }
}

bool LCAdinh(int u, int v)
{
    for (int i = LOGN - 1; i >= 0; i--)
    {
        if (deg[P[u][i]] >= deg[v])
            u = P[u][i];
    }
    return u == v;
}

ll LCAcanh(int u, int v)
{
    ll res = dp[u] - d[u];
    for (int i = LOGN - 1; i >= 0; i--)
    {
        if (deg[P[u][i]] >= deg[v])
        {
            res = min(res, M[u][i]);
            u = P[u][i];
        }
    }
    //res = min(res, dp[v]);
    return res;
}

void Solve()
{
    deg[e] = 1;
    DFS(e, 0);
    DFS2(e, 0);
    for (int i = 1; i < LOGN; i++)
        for (int j = 1; j <= n; j++)
        {
            P[j][i] = P[P[j][i - 1]][i - 1];
            M[j][i] = min(M[j][i - 1], M[P[j][i - 1]][i - 1]);
        }
    while (q-- > 0)
    {
        int id, r;
        cin >> id >> r;
        if (P[es[id].u][0] == es[id].v)
            swap(es[id].u, es[id].v);
        if (!LCAdinh(r, es[id].v))
        {
             cout << "escaped\n";
             continue;
        }
        ll ans = LCAcanh(r, es[id].v);
        if (ans + d[r] == INF)
            cout << "oo\n";
        else
            cout << ans + d[r] << '\n';
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    //freopen(task".INP" , "r" , stdin);
    //freopen(taskname".OUT" , "w" , stdout);
    Input();
    Solve();
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 6 ms 2772 KB Output is correct
2 Correct 5 ms 2772 KB Output is correct
3 Correct 5 ms 2772 KB Output is correct
4 Correct 6 ms 2772 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 2772 KB Output is correct
2 Correct 5 ms 2772 KB Output is correct
3 Correct 5 ms 2772 KB Output is correct
4 Correct 6 ms 2772 KB Output is correct
5 Correct 2 ms 2900 KB Output is correct
6 Correct 2 ms 2900 KB Output is correct
7 Correct 2 ms 2900 KB Output is correct
8 Correct 3 ms 2900 KB Output is correct
9 Correct 2 ms 2900 KB Output is correct
10 Correct 3 ms 2900 KB Output is correct
11 Correct 3 ms 2900 KB Output is correct
12 Correct 2 ms 2900 KB Output is correct
13 Correct 2 ms 2900 KB Output is correct
14 Correct 3 ms 3028 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 163 ms 32660 KB Output is correct
2 Correct 209 ms 32412 KB Output is correct
3 Correct 180 ms 32272 KB Output is correct
4 Correct 234 ms 34148 KB Output is correct
5 Correct 219 ms 34264 KB Output is correct
6 Correct 228 ms 36056 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 2772 KB Output is correct
2 Correct 5 ms 2772 KB Output is correct
3 Correct 5 ms 2772 KB Output is correct
4 Correct 6 ms 2772 KB Output is correct
5 Correct 2 ms 2900 KB Output is correct
6 Correct 2 ms 2900 KB Output is correct
7 Correct 2 ms 2900 KB Output is correct
8 Correct 3 ms 2900 KB Output is correct
9 Correct 2 ms 2900 KB Output is correct
10 Correct 3 ms 2900 KB Output is correct
11 Correct 3 ms 2900 KB Output is correct
12 Correct 2 ms 2900 KB Output is correct
13 Correct 2 ms 2900 KB Output is correct
14 Correct 3 ms 3028 KB Output is correct
15 Correct 163 ms 32660 KB Output is correct
16 Correct 209 ms 32412 KB Output is correct
17 Correct 180 ms 32272 KB Output is correct
18 Correct 234 ms 34148 KB Output is correct
19 Correct 219 ms 34264 KB Output is correct
20 Correct 228 ms 36056 KB Output is correct
21 Correct 156 ms 32716 KB Output is correct
22 Correct 177 ms 32332 KB Output is correct
23 Correct 176 ms 32424 KB Output is correct
24 Correct 217 ms 34348 KB Output is correct
25 Correct 246 ms 37172 KB Output is correct
26 Correct 145 ms 32768 KB Output is correct
27 Correct 166 ms 32424 KB Output is correct
28 Correct 227 ms 32332 KB Output is correct
29 Correct 221 ms 33944 KB Output is correct
30 Correct 265 ms 35148 KB Output is correct
31 Correct 157 ms 32740 KB Output is correct
32 Correct 157 ms 32520 KB Output is correct
33 Correct 198 ms 32484 KB Output is correct
34 Correct 210 ms 34248 KB Output is correct
35 Correct 227 ms 36976 KB Output is correct
36 Correct 206 ms 34928 KB Output is correct