这题卡树剖吗
查看原帖
这题卡树剖吗
236416
_stOrz_楼主2022/3/22 23:31

rt

TLE 11, 12

code:

#include<bits/stdc++.h>
using namespace std;
const int SIZE = 1000005;
int to, son[SIZE], dep[SIZE], siz[SIZE], fa[SIZE], tp[SIZE], id[SIZE], rev[SIZE];
//vector<int>v[2*SIZE];
struct node{
    int to, next;
}k[SIZE];
int head[SIZE], number;
inline void add(int x, int y){
    ++number;
    k[number].to = y;
    k[number].next = head[x];
    head[x] = number;
}
void dfs(int now, int f){
    siz[now] = 1;
    for(register int i = head[now]; ~i; i = k[i].next){
        to = k[i].to;
        if(to == f) continue;
        dep[to] = dep[now] + 1;
        fa[to] = now;
        dfs(to, now);
        siz[now] += siz[to];
        if(siz[to] > siz[son[now]]) son[now] = to;  
    }
}
void dfs2(int now){
    if(now == son[fa[now]])
        tp[now] = tp[fa[now]];
    else tp[now] = now;
    for(register int i = head[now]; ~i; i = k[i].next){
        if(k[i].to != fa[now]) dfs2(k[i].to);
    }
}
inline int LCA(int x, int y){
    while(tp[x] != tp[y]){
        if(dep[tp[x]] > dep[tp[y]])
            x = fa[tp[x]];
        else y = fa[tp[y]];
    }
    return dep[x] > dep[y]?y:x;
}
int main()
{
    int n, m, s, x, y;
	scanf("%d%d%d", &n, &m, &s);
    for(register int i = 1; i <= n - 1; i++){
        scanf("%d%d", &x, &y);
        add(x, y), add(y, x);
    }
    dfs(s, 0);
    dfs2(s);
    for(register int i = 1; i <= m; i++){
        scanf("%d%d", &x, &y);
        printf("%d\n", LCA(x, y));
    }
}
2022/3/22 23:31
加载中...