社区讨论
萌新妹子90pts求调
P3398仓鼠找 sugar参与者 5已保存回复 12
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 12 条
- 当前快照
- 1 份
- 快照标识符
- @mieaw9sn
- 此快照首次捕获于
- 2025/11/25 16:15 3 个月前
- 此快照最后确认于
- 2025/11/25 17:20 3 个月前
rt,第 8 个点 WA 了,救救/kel
CPP#include<vector>
#include<iostream>
#define int long long
using namespace std;
const int N=5e5+5;
int n,q,fas[N],dep[N],siz[N],son[N],top[N];
vector<int> edges[N];
void dfs1(int x,int fa){
fas[x]=fa,siz[x]=1,dep[x]=dep[fa]+1;
for(int l:edges[x]){
if(l==fa) continue;
dfs1(l,x);siz[x]+=siz[l];
if(siz[l]>siz[son[x]]) son[x]=l;
}
}
void dfs2(int x,int tot){
top[x]=tot;
if(son[x]) dfs2(son[x],tot);
for(int l:edges[x])
if(l!=son[x]&&l!=fas[x]) dfs2(l,l);
}
int LCA(int x,int y){
while(top[x]!=top[y]){
if(fas[top[x]]<fas[top[y]]) swap(x,y);
x=fas[top[x]];
}
return dep[x]<dep[y]?x:y;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>q;int f,l,a,b,c,d;
for(int i=1;i<n;i++){
cin>>f>>l;
edges[f].push_back(l);
edges[l].push_back(f);
}
dfs1(1,0);dfs2(1,1);
while(q--){
cin>>a>>b>>c>>d;
int lca1=LCA(a,b),lca2=LCA(c,d);
if(dep[lca1]>dep[lca2]){
if(LCA(lca1,c)==lca1||LCA(lca1,d)==lca1) cout<<"Y\n";
else cout<<"N\n";
}
else{
if(LCA(lca2,a)==lca2||LCA(lca2,b)==lca2) cout<<"Y\n";
else cout<<"N\n";
}
}
return 0;
}
回复
共 12 条回复,欢迎继续交流。
正在加载回复...