Advertisement
Guest User

Ink Colors

a guest
Nov 19th, 2018
772
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #ifdef LOCAL
  6.   #define dbg(args...) { err("[dbg] ", args); }
  7. #else
  8.   #define dbg(args...)
  9. #endif
  10.  
  11. void err() { cerr << endl; }
  12. template<typename T, typename... Args>
  13. void err(T a, Args... args) { cerr << a; err(args...); }
  14.  
  15. typedef long long ll;
  16. typedef long double lf;
  17. typedef pair<int,int> pii;
  18.  
  19. const int MAXN = 1e5 + 100;
  20. const int oo = 1e8 + 100;
  21. const int MOD = 1e9 + 7;
  22. const lf EPS = 1e-9;
  23.  
  24. struct data { int u, f0, f1; };
  25.  
  26. int n;
  27. vector<int> graph[MAXN];
  28.  
  29. int tc;
  30. int seen[4][MAXN];
  31. int dp[4][MAXN];
  32.  
  33. int best_change(const vector<data>& all, int used = -1) {
  34.   int cnt = 2, ret = 0;
  35.   for(auto& d : all) {
  36.     if(cnt == 0) break;
  37.     if(d.u == used) continue;
  38.     ret += d.f0 - max(d.f0, d.f1);
  39.     cnt--;
  40.   }
  41.   return cnt == 0 ? ret : -oo;
  42. }
  43.  
  44. int go(int u, int lvl) {
  45.   int& r = dp[lvl][u];
  46.   if(seen[lvl][u] == tc) return r;
  47.   seen[lvl][u] = tc;
  48.   if(lvl == 0) {
  49.     r = 0;
  50.     for(auto& v : graph[u])
  51.       r += max(go(v, 0), go(v, 1) + 1);
  52.   } else {
  53.     vector<data> all;
  54.     int sum = 0;
  55.     for(auto& v : graph[u]) {
  56.       int f0 = go(v, 0), f1 = go(v, 1) + 1;
  57.       all.push_back({v, f0, f1});
  58.       sum += max(f0, f1);
  59.     }
  60.     sort(all.begin(), all.end(), [&](const data& d1, const data& d2) {
  61.       return d1.f1 - d1.f0 < d2.f1 - d2.f0;
  62.     });
  63.     if(lvl == 1) {
  64.       r = -oo;
  65.       for(auto& d : all) {
  66.         r = max(r, sum + (go(d.u, 2)-max(d.f0, d.f1)) + best_change(all, d.u));
  67.       }
  68.     } else {
  69.       r = sum + best_change(all);
  70.     }
  71.   }
  72.   return r;
  73. }
  74.  
  75. int main() {
  76.   #ifdef LOCAL
  77.     freopen("input.txt", "r", stdin);
  78.     // freopen("output.txt", "w", stdout);
  79.   #else
  80.     // ios::sync_with_stdio(0); cin.tie(0);
  81.     #define endl '\n'
  82.   #endif
  83.  
  84.   for(tc = 1; scanf("%d", &n) == 1; ++tc) {
  85.     for(int i = 1; i <= n; ++i) {
  86.       graph[i].clear();
  87.     }
  88.     for(int i = 2; i <= n; ++i) {
  89.       int p; scanf("%d", &p);
  90.       graph[p].push_back(i);
  91.     }
  92.     printf("%d\n", go(1, 0));
  93.   }
  94.  
  95.   return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement