- 所以说我们的点的子节点的时间区间一定包含在这个点的时间区间内。
- 所以如果一个点的起始时间和终结时间被另一个点包括,这个点肯定是另一个点的子节点。(算导里称之为括号化定理)
- 因此可以判断一个点是否是另一个点的子节点。
-
#include<bits/stdc++.h> using namespace std; #define maxn 2222222 int n,q,l[maxn],cnt; int u,v,r[maxn]; bool vis[maxn]; vector<int>mmp[maxn]; void dfs(int x) { l[x]=++cnt; int len=mmp[x].size(); for(int i=0; i<len; i++) dfs(mmp[x][i]); r[x]=cnt; } int main() { cin>>n>>q; for(int i=0; i<n; i++) { cin>>u; if(u!=-1) { mmp[u].push_back(i); vis[i]=1; } } for(int i=0; i<n; i++) { if(!vis[i]) dfs(i); } while(q--) { cin>>u>>v; if(l[v]<=l[u]&&l[u]<=r[v]) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }