subtask被卡常了
查看原帖
subtask被卡常了
1079004
MelancholyZ楼主2024/12/10 23:45

第一遍写了倍增但是没加快读,subtask3直接T掉,超了0.01s?!!

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, m, s,dep[N], a, b,anc[N][20];
vector<int> g[N];
inline int read(){
    int w = 0,f = 1;
    char ch = getchar();
    while(!isdigit(ch)){
        if(ch == '-') f *= -1;
        ch = getchar();
    }
    while(isdigit(ch)){
        w = (w << 1) + (w << 3) + (ch - 48);
        ch = getchar();
    }
    return w * f;
}
void dfs(int u,int fa)
{
    for (auto v : g[u])
    {
        if (v == fa)
            continue;
        //fa[v] = u;
        dep[v] = dep[u] + 1;
        anc[v][0] = u;
        dfs(v,u);
    }
}
void init(){
    for(int j = 1; j <= 18; j ++)
        for(int i = 1; i <= n; i ++)
            anc[i][j] = anc[anc[i][j-1]][j-1];

}
int LCA(int u, int v)
{
    if(dep[u] < dep[v]) swap(u,v);
    for(int i = 18; i >= 0; i --){
        if(dep[anc[u][i]] >= dep[v]) u = anc[u][i];
    }
    if(u == v) return u;
    for(int i = 18; i >= 0; i --){
        while(anc[u][i] != anc[v][i]) u = anc[u][i],v = anc[v][i]; 
    }
    return anc[u][0];
}
int main()
{
    //ios::sync_with_stdio(0);
    n = read(),m = read(),  s = read();
    for (int i = 1, u, v; i < n; i++)
    {
        u = read(),v = read();
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dep[s] = 1;
    dfs(s,0);
    init();
    while (m--)
    {
        a = read() , b= read();
        if (a == b)
            cout << a << endl;
        else
            cout << LCA(a, b) << endl;
    }
    return 0;
}
2024/12/10 23:45
加载中...