DuongNhi99

FIREWORKS

Nov 28th, 2020 (edited)
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4.  
  5. const int N = 2e5 + 5;
  6.  
  7. int n, m;
  8. vector<int> a[N];
  9. int d[N], dem[N];
  10. bool ok = false;
  11. ll ans;
  12.  
  13. ll rood(int u) {
  14.     if(dem[u] > 1) return u;
  15.  
  16.     if(dem[u] == 1) {
  17.         int uv = a[u][0];
  18.         rood(uv);
  19.     }
  20. }
  21.  
  22. void DFS(int u) {
  23.     for(int v : a[u]) {
  24.         if(v != 0) {
  25.             d[v] = d[u] + 1;
  26.             DFS(v);
  27.         }
  28.     }
  29. }
  30.  
  31. void solve() {
  32.  
  33.     for(int i = 2; i <= n; ++i) {
  34.         int x; cin >> x;
  35.         a[x].push_back(i);
  36.         dem[x]++;
  37.         if(dem[x] >= 2) ok = true;
  38.     }
  39.  
  40.     if(!ok) {
  41.         cout << n * m << '\n';
  42.         return;
  43.     }
  44.  
  45.     if(dem[1] == n-1) {
  46.         cout << 3*m << '\n';
  47.         return;
  48.     }
  49.  
  50.     int maxx = 0, minn = 0;
  51.     ll uv = 1;
  52.     uv = max(uv, rood(1));
  53.  
  54.     for(int i = 1; i <= n; ++i)
  55.         a[i].push_back(0);
  56.  
  57.     for(int u : a[uv]) {
  58.         if(a[u].size() != 1) {
  59.             fill(d + 1, d + n + 1, 0);
  60.             DFS(u);
  61.  
  62.             int k = *max_element(d + 1, d + n + 1);
  63.             if(maxx < k) {
  64.                 minn = maxx;
  65.                 maxx = k;
  66.             }
  67.             else if(minn < k) {
  68.                 minn = k;
  69.             }
  70.         }
  71.     }
  72.     maxx += 2; minn++;
  73.     //cout << uv << ' ' << maxx << ' ' << minn << '\n';
  74.  
  75.     ans = (maxx*m + (uv-1) * (m-1)) + (minn + (maxx+uv-1) * (m-1));
  76.     cout << ans << '\n';
  77. }
  78.  
  79. int main()
  80. {
  81.     freopen("in.txt", "r", stdin);
  82.     //freopen("FIREWORKS.inp", "r", stdin);
  83.     //freopen("FIREWORKS.out", "w", stdout);
  84.     ios_base::sync_with_stdio(false);
  85.     cin.tie(0); cout.tie(0);
  86.  
  87.     cin >> n >> m;
  88.     solve();
  89.  
  90.     return 0;
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment