Submission #1593154


Source Code Expand

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <unordered_map>
#include <set>
#include <climits>
using namespace std;

class LCA{
public:
    vector<int> dep;
    vector<vector<int>> par;
    LCA(int N, vector<vector<int>> &G, int s) : dep(N), par(N){
        vector<bool> isVisited(N, false);
        isVisited[s] = true;
        dfs1(N, G, isVisited, s, 0);
    
        int maxdepth = *max_element(dep.begin(), dep.end());
        int M = 1;
        for(int fac=1;; fac*=2){
            if(fac >= maxdepth) break;
            M++;
        }
        for(int i=0; i<N; i++) par[i].resize(M);
        par[s][0] = s;
        fill(isVisited.begin(), isVisited.end(), false);
        isVisited[s] = true;
        dfs2(N, M, G, isVisited, s);
    }
    void dfs1(int N, vector<vector<int>> &G, vector<bool> &isVisited, int s, int d){
        dep[s] = d;
        for(int t : G[s]){
            if(isVisited[t]) continue;
            isVisited[t] = true;
            dfs1(N, G, isVisited, t, d+1);
        }
    }
    void dfs2(int N, int M, vector<vector<int>> &G, vector<bool> &isVisited, int s){
        for(int i=1; i<M; i++)
            par[s][i] = par[par[s][i-1]][i-1];

        for(int t : G[s]){
            if(isVisited[t]) continue;
            isVisited[t] = true;
            par[t][0] = s;
            dfs2(N, M, G, isVisited, t);
        }
    }

    int get(int u, int v){
        int M = par[0].size();
        if(dep[u] > dep[v]) swap(u, v);
        int diff = dep[v] - dep[u];
        vector<int> vec;
        for(int i=0; i<M; i++)
            if(diff & (1 << i)) vec.push_back(i);
        reverse(vec.begin(), vec.end());
        for(int x : vec)
            v = par[v][x];

        if(u == v) return u;
        while(par[u][0] != par[v][0]){
            for(int i=M-1; i>=0; i--){
                if(par[u][i] != par[v][i]){
                    u = par[u][i];
                    v = par[v][i];
                }
            }
        }
        return par[u][0];
    }
};

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int N;
    cin >> N;
    vector<vector<int>> G(N);
    for(int i=0; i<N-1; i++){
        int x, y;
        cin >> x >> y;
        x--; y--;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    LCA lca(N, G, 0);
    int Q;
    cin >> Q;
    for(int i=0; i<Q; i++){
        int a, b;
        cin >> a >> b;
        a--; b--;
        int ab = lca.get(a, b);
        int ans = lca.dep[a]+lca.dep[b]-2*lca.dep[ab]+1;
        cout << ans << endl;
    }

    return 0;
}

Submission Info

Submission Time
Task D - 閉路
User suzume
Language C++14 (GCC 5.4.1)
Score 100
Code Size 2682 Byte
Status AC
Exec Time 315 ms
Memory 19712 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 1 ms 256 KB
subtask0_sample02.txt AC 1 ms 256 KB
subtask0_sample03.txt AC 1 ms 256 KB
subtask1_01.txt AC 49 ms 19072 KB
subtask1_02.txt AC 50 ms 19072 KB
subtask1_03.txt AC 1 ms 256 KB
subtask1_04.txt AC 1 ms 256 KB
subtask1_05.txt AC 2 ms 384 KB
subtask1_06.txt AC 2 ms 384 KB
subtask1_07.txt AC 51 ms 13312 KB
subtask1_08.txt AC 57 ms 13184 KB
subtask1_09.txt AC 57 ms 13184 KB
subtask1_10.txt AC 54 ms 13184 KB
subtask1_11.txt AC 58 ms 14720 KB
subtask1_12.txt AC 60 ms 14720 KB
subtask2_01.txt AC 255 ms 19712 KB
subtask2_02.txt AC 253 ms 19712 KB
subtask2_03.txt AC 175 ms 512 KB
subtask2_04.txt AC 179 ms 512 KB
subtask2_05.txt AC 196 ms 640 KB
subtask2_06.txt AC 203 ms 768 KB
subtask2_07.txt AC 258 ms 13568 KB
subtask2_08.txt AC 269 ms 13568 KB
subtask2_09.txt AC 273 ms 13568 KB
subtask2_10.txt AC 293 ms 13568 KB
subtask2_11.txt AC 308 ms 15104 KB
subtask2_12.txt AC 315 ms 15104 KB