Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector<int> flag;
- //vector<int> prev;
- bool check = false;
- int lst = -1;
- vector<bool> cyc;
- vector<pair<int, int>> dp;
- vector<vector<int>> a;
- vector<bool> used;
- void dfs(int v){
- flag[v] = 1;
- if(check)
- return;
- for(int u : a[v]){
- if(flag[u] == 0){
- //prev[u] = v;
- dfs(u);
- }
- if(flag[u] == 1){
- lst = u;
- break;
- }
- }
- if(!check)
- flag[v] = 2;
- }
- void cycle(int v){
- cyc[v] = true;
- for(int u : a[v]){
- if(flag[u] == 1)
- cycle(u);
- }
- }
- pair<int, int> tsolve(int v){
- used[v] = true;
- if(a[v].size() == 0){
- pair<int, int> xd = {1, 0};
- return xd;
- }
- int with = 0;
- int without = 0;
- for(int u : a[v]){
- if(!cyc[u] && !used[u]){
- pair<int, int> xd = tsolve(u);
- with += xd.second;
- without += max(xd.first, xd.second);
- }
- }
- pair<int, int> xd = {with, without + 1};
- return(xd);
- }
- int main()
- {
- int n;
- cin >> n;
- flag.resize(n);
- cyc.resize(n);
- dp.resize(n);
- a.resize(n);
- used.resize(n);
- for(int i = 0; i < n; ++i){
- int x;
- cin >> x;
- x--;
- if(x == -2)
- continue;
- a[i].push_back(x);
- a[x].push_back(i);
- }
- pair<int, int> ans = tsolve(0);
- cout << ans.first << " " << ans.second << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement