https://www.nowcoder.com/acm/contest/40/B
题意:
珂朵莉给你一个有根树,求有多少个子树满足其内部节点编号在值域上连续。
思路:
统计每棵子树的最大最小值以及其子树大小。
1 #include<cstdio> 2 #include<iostream> 3 #include<vector> 4 using namespace std; 5 const int maxn = 100000+5; 6 7 int n, num[maxn],mi[maxn],mx[maxn],degree[maxn]; 8 vector<int> g[maxn]; 9 10 void dfs(int u) 11 { 12 num[u] = 1; 13 mi[u] = mx[u] = u; 14 for(int i=0;i<g[u].size();i++) 15 { 16 int v = g[u][i]; 17 dfs(v); 18 num[u] += num[v]; 19 mi[u] = min(mi[u], mi[v]); 20 mx[u] = max(mx[u], mx[v]); 21 } 22 } 23 24 int main() 25 { 26 //freopen("in.txt","r",stdin); 27 scanf("%d",&n); 28 for(int i=1;i<n;i++) 29 { 30 int u,v; 31 scanf("%d%d",&u,&v); 32 g[u].push_back(v); 33 degree[v]++; 34 } 35 int root; 36 for(int i=1;i<=n;i++) 37 { 38 if(degree[i]==0) 39 { 40 root = i; 41 break; 42 } 43 } 44 dfs(root); 45 int ans = 0; 46 for(int i=1;i<=n;i++) 47 { 48 if(mx[i]-mi[i]==num[i]-1) ans++; 49 } 50 printf("%d ",ans); 51 return 0; 52 }