RE求条
查看原帖
RE求条
1187632
Y75C楼主2025/7/30 14:36

提交记录

#include<bits/stdc++.h>
using namespace std;
const int mx=1e5+10;
int n,m,s;
int h[mx],st[mx][24];
vector<int> tree[mx];
void dfsh(int n,int fa){
  h[n]=h[fa]+1,st[n][0]=fa;
  for(int i=0;i<tree[n].size();i++){
    if(tree[n][i]!=fa) dfsh(tree[n][i],n);
  }
}
int lca(int u,int v){//u>=v
  if(h[u]>h[v]) swap(u,v);
  int cz=h[v]-h[u];
  for(int i=0;(1<<i)<=cz;i++){
    if((cz>>i)&1){
      v=st[v][i];cz^=(1<<i);
    }
  }
  //printf("u%d v%d ",u,v);
  if(u==v) return u;
  for(int i=18;i>=0;i--){ 
    if(st[u][i]==st[v][i]) continue;
    u=st[u][i];v=st[v][i];
    //printf("u%d v%d ",u,v);
  }
  return st[u][0];
}
int main(){
  scanf("%d%d%d",&n,&m);
  for(int i=1;i<n;i++){
    int x,y;
    scanf("%d%d",&x,&y);
    tree[x].push_back(y);tree[y].push_back(x);
  }
  h[0]=0,dfsh(1,0);
  for(int i=1;(1<<i)<=n;i++){
    for(int j=1;j<=n;j++){
      st[j][i]=st[st[j][i-1]][i-1];
    }
  }
  while(m--){
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    int l1=lca(a,b),l2=lca(c,d);
    int l3=lca(l1,l2);
    if(l1==l2||l3==l1||l3==l2) printf("Y\n");
    else printf("N\n");
  }
  return 0;
}
2025/7/30 14:36
加载中...