Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. #include <iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<math.h>
  5. #include<set>
  6. #include<string>
  7. #pragma GCC optimize("Ofast")
  8. #pragma GCC optimize("unroll-loops")
  9. #include <cassert>
  10.  
  11. using namespace std;
  12. #define int long long
  13. typedef long long lli;
  14. typedef long double ld;
  15. //const double E = 0.0000001;
  16. const int INF = 1e7;
  17. #define forn(i, s, f) for (int i = s; i < f; ++i)
  18. #define ft first
  19. #define sec second
  20. #define fora(i, n) for (auto i : n)
  21. #define sz(a) (int)(a).size()
  22. #define sort_(a) sort(a.begin(), a.end())
  23. #define pb push_back
  24. #define mp make_pair
  25. #define fast_ cin.tie(0), ios_base::sync_with_stdio(false)
  26. int con = 30;
  27. vector<vector<int>> g;
  28. vector<int> pr, tin, tout, dis;
  29. int timer = 0;
  30.  
  31. void dfs(int v, int h) {
  32. dis[v] = h;
  33. tin[v] = timer;
  34. timer++;
  35. fora(u, g[v]) {
  36. dfs(u, h + 1);
  37. }
  38. tout[v] = timer;
  39. timer++;
  40. }
  41.  
  42. bool pre(int v, int u) {
  43. return tin[v] <= tin[u] && tout[u] <= tout[v];
  44. }
  45.  
  46. int lca(int v, int u, vector<vector<int>>& lca_) {
  47. if (pre(v, u)) {
  48. return v;
  49. }
  50. if (pre(u, v)) {
  51. return u;
  52. }
  53. for (int i = con - 1; i >= 0; i--) {
  54. if (!pre(lca_[i][v], u)) {
  55. v = lca_[i][v];
  56. }
  57. }
  58. return lca_[0][v];
  59. }
  60.  
  61. signed main()
  62. {
  63. fast_;
  64. int n;
  65. cin >> n;
  66. n++;
  67. //vector<int> ar(n);
  68. g.resize(n);
  69. tin.resize(n);
  70. tout.resize(n);
  71. dis.resize(n);
  72. vector<vector<int>> lca_(con, vector<int>(n, 0));
  73. pr.resize(n);
  74. forn(i, 1, n) {
  75. int a;
  76. cin >> a;
  77. a--;
  78. g[a].pb(i);
  79. pr[i] = a;
  80. lca_[0][i] = a;
  81. }
  82. forn(i, 1, con) {
  83. forn(j, 0, n) {
  84. lca_[i][j] = lca_[i - 1][lca_[i - 1][j]];
  85. }
  86. }
  87. dfs(0, 0);
  88. int v = 0, u = 0, an = 0;
  89. forn(i, 1, n) {
  90. //cout << dis[i] << endl;
  91. int cu = dis[i] + dis[v] - dis[lca(i, v, lca_)];
  92. int cu2 = dis[i] + dis[u] - dis[lca(i, u, lca_)];
  93. if (cu > cu2) {
  94. if (cu >= an) {
  95. an = cu;
  96. u = i;
  97. }
  98. }
  99. else {
  100. if (cu2 >= an) {
  101. an = cu2;
  102. v = i;
  103. }
  104. }
  105. cout << an << "\n";
  106. }
  107. return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement