蒟蒻刚学OI树形DP,此题求条啊
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int n, root, ans;
struct Node {
int father, maxn = 0, minn = 1e7, nodenum = 1;
vector<int> children;
bool isroot = 1;
} a[100005];
void setup(int node) {
a[node].children.clear();
a[node].maxn = a[node].minn = node;
}
void add(int u, int v) {
a[u].children.push_back(v);
a[u].nodenum += a[v].nodenum;
a[v].father = u;
a[v].isroot = 0;
}
void findRoot() {
for (int i = 1; i <= n; i ++) {
if (a[i].isroot) {
root = i;
return;
}
}
}
bool isAnAns (int node) {
return a[node].maxn - a[node].minn + 1 == a[node].nodenum;
}
void dfs(int node) {
for (auto i : a[node].children) {
a[node].maxn = max(a[node].maxn, a[i].maxn);
a[node].minn = min(a[node].minn, a[i].minn);
dfs(i);
}
if (isAnAns(node)) {
ans ++;
}
}
int main() {
int u, v;
cin >> n;
for (int i = 1; i <= n; i ++) {
setup(i);
}
while (cin >> u >> v) {
add(u, v);
}
findRoot();
dfs(root);
cout << ans;
return 0;
}