U142375 80' 求条!
  • 板块学术版
  • 楼主FlowerAccepted
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/1 21:13
  • 上次更新2025/1/2 15:34:30
查看原帖
U142375 80' 求条!
1023732
FlowerAccepted楼主2025/1/1 21:13

蒟蒻刚学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;
}
2025/1/1 21:13
加载中...