Codeforces Round #629 (Div. 3) E - Tree Queries dfs序判祖先关系

Wendy ·
更新时间:2024-09-20
· 652 次阅读

惭愧,前几天刚学的dfs序判祖先关系都忘了用。。

这题我们先把所有点都变成父亲节点(根节点不变),这样只需要判所有节点是否在一条链上。

由于判断x是y的祖先:需要满足:st[x]<=st[y]<=ed[y]<=ed[x].

即:一条链上的的所有点必须是相互包含的关系,一旦有个非链上的点,那么他一定与某个点不是祖先和孙子的关系,就会出现

min(ed[])>max(st[])的情况。

所以我们只需要判断  min(ed[])与max(st[])的关系即可

#include using namespace std; typedef long long ll; const int M = 2e5+7; int head[M],cnt; void init(){cnt=0,memset(head,-1,sizeof(head));} struct EDGE{int to,nxt,val;}ee[M*2]; void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;} int dep[M],f[M],st[M],ed[M],sz; void dfs(int u,int fa) { f[u]=fa; st[u]=++sz; for(int i=head[u];i;i=ee[i].nxt) { int v=ee[i].to; if(v==fa)continue; dfs(v,u); } ed[u]=sz; } int main() { // ios::sync_with_stdio(false); // cin.tie(0); int n,q,u,v; scanf("%d%d",&n,&q); for(int i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u); dfs(1,0); for(int i=1;i<=q;i++) { int m,x; int mi=1e9,mx=0; scanf("%d",&m); for(int j=1;jed的情况 if(mi>=mx)puts("YES"); else puts("NO"); } return 0; }
作者:夕林山寸



CodeForces 关系 dfs round tree div

需要 登录 后方可回复, 如果你还没有账号请 注册新账号