Submission #856704

#TimeUsernameProblemLanguageResultExecution timeMemory
856704vjudge1Valley (BOI19_valley)C++14
100 / 100
146 ms39460 KiB
#include <bits/stdc++.h>
using namespace std;
#define task ""

const int MAX = 100010;
int n, s, q, e;
long long INF;
bool shop[MAX];
pair<int, int> edges[MAX];
vector<pair<int, int>> adj[MAX];

int timer, tin[MAX], tout[MAX], h[MAX];
long long dep[MAX], minD[MAX][2];

void preDfs(int u, int p) {
    tin[u] = ++timer;
    if (shop[u]) minD[u][0] = 0;
    for (pair<int, int> &e: adj[u]) if (e.first != p) {
        int v = e.first, w = e.second;
        dep[v] = dep[u] + w;
        h[v] = h[u] + 1;
        preDfs(v, u);
        if (minD[u][0] >= minD[v][0] + w) {
            minD[u][1] = minD[u][0];
            minD[u][0] = minD[v][0] + w;
        } else minD[u][1] = min(minD[u][1], minD[v][0] + w);
    }
    tout[u] = timer;
}

long long getD(int u, int v, int w) {
    return minD[u][0] == minD[v][0] + w ? minD[u][1] : minD[u][0] - dep[u];
}

long long dp[17][MAX];
int anc[17][MAX];

void dfs(int u, int p) {
    for (pair<int, int> &e: adj[u]) if (e.first != p) {
        int v = e.first, w = e.second;
        dp[0][v] = getD(u, v, w);
        anc[0][v] = u;
        for (int j = 1; j <= 16; ++j) {
            anc[j][v] = anc[j - 1][anc[j - 1][v]];
            dp[j][v] = min(dp[j - 1][v], dp[j - 1][anc[j - 1][v]]);
        }
        dfs(v, u);
    }
}

bool isAnc(int u, int v) {
    return tin[u] <= tin[v] && tout[v] <= tout[u];
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(nullptr);

	if (fopen(task".inp", "r")) {
		freopen(task".inp", "r", stdin);
		freopen(task".out", "w", stdout);
	}

	cin >> n >> s >> q >> e;
	for (int i = 1; i < n; ++i) {
        int u, v, w; cin >> u >> v >> w;
        edges[i] = make_pair(u, v);
        adj[u].push_back(make_pair(v, w));
        adj[v].push_back(make_pair(u, w));
	}
	for (int i = 1; i <= s; ++i) {
        int u; cin >> u;
        shop[u] = true;
	}
	memset(minD, 0x3f, sizeof minD); INF = minD[0][0];
	preDfs(e, -1);
	dfs(e, -1);
	while (q--) {
        int id, R; cin >> id >> R;
        int u = edges[id].first, v = edges[id].second;
        if (tin[u] > tin[v]) swap(u, v);
        if (isAnc(v, R) == false) {
            cout << "escaped\n";
            continue;
        }
        long long ans = minD[R][0];
        if (v != R) {
            u = R;
            for (int j = 0, k = h[R] - h[v]; (1 << j) <= k; ++j) {
                if (k >> j & 1) {
                    ans = min(ans, dep[R] + dp[j][u]);
                    u = anc[j][u];
                }
            }
        }
        if (ans == INF) cout << "oo\n";
        else cout << ans << '\n';
	}
	return 0;
}

Compilation message (stderr)

valley.cpp: In function 'int main()':
valley.cpp:59:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |   freopen(task".inp", "r", stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:60:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |   freopen(task".out", "w", stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...