社区讨论
本题全网第一个90分求调
P3398仓鼠找 sugar参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m3eftx0l
- 此快照首次捕获于
- 2024/11/12 20:37 去年
- 此快照最后确认于
- 2024/11/12 20:51 去年
目光所及之处真的没有找到一个同分的
CPP#include<bits/stdc++.h>
using namespace std;
int n,q,f[100005][35],dep[100005],l[100005];
vector<int> v[100005];
int lowbit(int i)
{
return i & -i;
}
void dfs(int now,int fa)
{
f[now][0]=fa; dep[now]=dep[fa]+1;
for(register int i=1;i<=l[dep[now]-1];++i)
f[now][i]=f[f[now][i-1]][i-1];
for(register int i=0;i<v[now].size();++i)
{
int to=v[now][i];
if(to==fa) continue;
dfs(to,now);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
while(dep[x]!=dep[y]) x=f[x][l[dep[x]-dep[y]]];
if(x==y) return x;
for(register int i=l[dep[x]-1];i>=0;--i)
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>q; l[0]=-1;
for(register int i=1;i<n;++i)
{
int x,y;
cin>>x>>y;
v[x].push_back(y),v[y].push_back(x);
l[i]=l[i-1]+(lowbit(i)==i);
}
dfs(1,0);
for(register int i=1;i<=q;++i)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int fab=lca(a,b),fcd=lca(c,d);
if(dep[fab]>dep[fcd])
if(lca(fab,c)==fab||lca(fab,d)==fab) cout<<"Y\n";
else cout<<"N\n";
else if(dep[fab]==dep[fcd]) cout<<"Y\n";
else
if(lca(fcd,a)==fcd||lca(fcd,b)==fcd) cout<<"Y\n";
else cout<<"N\n";
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...