题目链接:https://www.nowcoder.com/acm/contest/40/B
*一定要注意题目中的“连续”,即只需要记录子树中的三个要素:最小值Min、最大值Max和节点个数Size;
*做个dfs遍历一遍树,每棵树的节点Size等于本身1+全部子树的Size,Max、Min也是本身与全部子树的Max、Min比较;
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <math.h>
#define Maxn 100010
using namespace std;
int Size[Maxn]={0},Min[Maxn],Max[Maxn];
int ans=0;
vector <int> V[Maxn];
void dfs(int rt){
Min[rt]=Max[rt]=rt;
for(int i=0;i<V[rt].size();++i){
int son=V[rt][i];
dfs(son);
Size[rt]+=Size[son];
Max[rt]=max(Max[son],Max[rt]);
Min[rt]=min(Min[son],Min[rt]);
}
if(Max[rt]-Min[rt]+1==Size[rt])++ans;
}
int main(){
int n;scanf("%d",&n);
int x,y;
for(int i=1;i<n;++i){
scanf("%d%d",&x,&y);
V[x].push_back(y);
Size[y]=1;
}
for(int i=1;i<=n;++i)
if(Size[i]==0){Size[i]=1;dfs(i);break;}
printf("%d\n",ans);
return 0;
}