Submission #1189324

#TimeUsernameProblemLanguageResultExecution timeMemory
1189324anmattroiTourism (JOI23_tourism)C++17
28 / 100
5090 ms14788 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define maxn 100005
using namespace std;
using ii = pair<int, int>;

int n, m, q, d[maxn], c[maxn], id = 0, euler[maxn];
vector<int> adj[maxn];

int f[18][maxn];

void pfs(int u, int dad) {
    f[0][u] = dad;
    euler[u] = ++id;
    for (int i = 1; i <= 17; i++) f[i][u] = f[i-1][f[i-1][u]];
    for (int v : adj[u])
    if (v != dad) {
        d[v] = d[u] + 1;
        pfs(v, u);
    }
}

int lca(int u, int v) {
    function<int(int, int)> jump = [&](int x, int k) {
        for (int i = 0; i <= 17; i++) if (k>>i&1) x = f[i][x];
        return x;
    };

    if (d[u] > d[v]) swap(u, v);
    if (d[u] < d[v]) v = jump(v, d[v]-d[u]);

    if (u == v) return u;
    for (int i = 17; i >= 0; i--)
    if (f[i][u] != f[i][v]) {
        u = f[i][u];
        v = f[i][v];
    }
    return f[0][u];
}

int dis(int u, int v) {
    return d[u] + d[v] - 2 * d[lca(u, v)];
}


void solve() {
    int l, r;
    cin >> l >> r;
    vector<int> a;
    for (int i = l; i <= r; i++) a.emplace_back(c[i]);
    sort(a.begin(), a.end(), [&](int x, int y) {return euler[x] < euler[y];});

    int ans = 0;
    for (int i = 1; i < a.size(); i++) ans += dis(a[i], a[i-1]);
    ans += dis(a[0], a.back());
    cout << ans / 2 + 1 << "\n";
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> m >> q;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].emplace_back(v);
        adj[v].emplace_back(u);
    }
    pfs(1, 0);
    for (int i = 1; i <= m; i++) cin >> c[i];
    while (q--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...