Submission #7499259


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX_V 100000

vector<int> G[MAX_V];
int V;
int par[20][MAX_V], depth[MAX_V];
// par[k][v] := vの2^k先の祖先(根を超すときは-1)

void dfs(int v, int p, int d) {
    par[0][v] = p;
    depth[v] = d;
    for (int i = 0; i < G[v].size(); i++) {
        if (G[v][i] != p) dfs(G[v][i], v, d + 1);
    }
}

void init(int root = 0) {
    dfs(root, -1, 0);
    for (int k = 0; k <= (int)log2(V); k++) {
        for (int v = 0; v < V; v++) {
            if (par[k][v] < 0)
                par[k + 1][v] = -1;
            else
                par[k + 1][v] = par[k][par[k][v]];
        }
    }
}

int lca(int u, int v) {
    if (depth[u] > depth[v]) swap(u, v);
    for (int k = 0; k <= (int)log2(V); k++) {
        if ((depth[v] - depth[u]) >> k & 1) {
            v = par[k][v];
        }
    }
    if (u == v) return u;

    for (int k = (int)log2(V); k >= 0; k--) {
        if (par[k][u] != par[k][v]) {
            u = par[k][u];
            v = par[k][v];
        }
    }
    return par[0][u];
}

int main() {
    cin >> V;
    for (int i = 0; i < V - 1; i++) {
        int x, y;
        cin >> x >> y;
        x--, y--;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    init();
    int Q;
    cin >> Q;
    for (int i = 0; i < Q; i++) {
        int a, b, c;
        cin >> a >> b;
        a--, b--;
        c = lca(a, b);
        cout << depth[a] + depth[b] - 2 * depth[c] + 1 << endl;
    }
    return 0;
}

Submission Info

Submission Time
Task D - 閉路
User syak
Language C++14 (GCC 5.4.1)
Score 100
Code Size 1572 Byte
Status AC
Exec Time 381 ms
Memory 20864 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 70 / 70
Status
AC × 3
AC × 12
AC × 27
Set Name Test Cases
Sample subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt
Subtask1 subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt
Subtask2 subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt
Case Name Status Exec Time Memory
subtask0_sample01.txt AC 4 ms 2816 KB
subtask0_sample02.txt AC 2 ms 2688 KB
subtask0_sample03.txt AC 2 ms 2688 KB
subtask1_01.txt AC 74 ms 20224 KB
subtask1_02.txt AC 74 ms 20224 KB
subtask1_03.txt AC 2 ms 2688 KB
subtask1_04.txt AC 2 ms 4736 KB
subtask1_05.txt AC 3 ms 6784 KB
subtask1_06.txt AC 3 ms 6784 KB
subtask1_07.txt AC 84 ms 14080 KB
subtask1_08.txt AC 82 ms 13952 KB
subtask1_09.txt AC 82 ms 13952 KB
subtask1_10.txt AC 82 ms 13952 KB
subtask1_11.txt AC 85 ms 13952 KB
subtask1_12.txt AC 81 ms 13952 KB
subtask2_01.txt AC 318 ms 20864 KB
subtask2_02.txt AC 320 ms 20736 KB
subtask2_03.txt AC 201 ms 2816 KB
subtask2_04.txt AC 229 ms 4864 KB
subtask2_05.txt AC 235 ms 7040 KB
subtask2_06.txt AC 233 ms 7168 KB
subtask2_07.txt AC 352 ms 14336 KB
subtask2_08.txt AC 353 ms 14208 KB
subtask2_09.txt AC 366 ms 14336 KB
subtask2_10.txt AC 366 ms 14336 KB
subtask2_11.txt AC 381 ms 14336 KB
subtask2_12.txt AC 371 ms 14336 KB