牛客练习赛9 珂朵莉的值域连续段

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 }
原文地址:https://www.cnblogs.com/zyb993963526/p/8459116.html