菜只因求助
查看原帖
菜只因求助
632955
伊地知虹夏楼主2023/1/13 21:46
#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
int n,m,s,d[N];
int LCA[N][22],dis[N];
vector<int> g[N];
void dfs(int cur,int dep){
    d[cur] = dep;
    for(int i = 0;i < g[cur].size();i ++){
        int y = g[cur][i];
        if(d[y] == 0) 
            LCA[y][0] = cur,dis[y]=dis[cur]+1,dfs(y,dep+1);
    }
    return ;
}
void init(){
    for(int j = 1;j <= 20;j ++)
        for(int i = 1;i <= n;i ++)
            LCA[i][j] = LCA[LCA[i][j-1]][j-1];
}
int lca(int a, int b)
{
    if(d[a] < d[b]) swap(a,b);
    int sum = d[a] - d[b];
    for(int i = 20;i >= 0;i --)
        if(sum >= (1 << i))
            sum -= (1 << i),
            a = LCA[a][i];
    if(a == b) return a;
    for(int i = 20;i >= 0;i --)
        if(LCA[a][i] != LCA[b][i])
            a = LCA[a][i],b = LCA[b][i];
    return LCA[a][0];
}
int dist(int a,int b){
    return dis[a]+dis[b]-2*dis[lca(a,b)];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for(int i = 1;i < n;i ++){
        int x,y;
        cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    LCA[1][0] = 1;
    dfs(s,1);
    init();
    while(m --){
        int a,b,c,d;
        cin >> a >> b >> c >> d;
        if(dist(a,b)+dist(c,d)>=dist(a,c)+dist(b,d))cout <<"Y\n";
        else cout<<"N\n";
    }
    return 0;
}
2023/1/13 21:46
加载中...