Advertisement
Guest User

Untitled

a guest
Aug 6th, 2018
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. #pragma comment(linker,"/STACK:300000000")
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <math.h>
  5. #include <vector>
  6. #include <map>
  7. #include <set>
  8. #include <algorithm>
  9. #include <queue>
  10. #include <string>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #include <iomanip>
  14. #include <iterator>
  15. #include <unordered_map>
  16. #include <unordered_set>
  17. #include <stdlib.h>
  18.  
  19. using namespace std;
  20.  
  21. typedef long long ll;
  22. typedef unsigned long long ull;
  23. typedef long double ld;
  24. typedef pair<int, int> pii;
  25. typedef vector<int> vi;
  26. typedef vector<vi> vvi;
  27. typedef pair<ll, ll> pll;
  28. typedef pair<ull, ull> pull;
  29.  
  30. #define pb push_back
  31. #define mp make_pair
  32. #define eps 1e-9
  33. #define PI  3.14159265358979323846
  34. #define ACCEPTED return 0;
  35. #define name ""
  36.  
  37. const int  maxlen = (int)(2e5) + 10;
  38. const int    base = (int)(1e9);
  39. const ll      mod = 1000 * 1000 * 1000 + 7;
  40. const ll   bigmod = 99194853094755497ll;
  41. const ll infinity = (ll) 1e18;
  42.  
  43. ll C[(int)1e6 + 10];
  44. ll h[maxlen];
  45. pii T[maxlen];
  46. ll timer = 0;
  47. vector<vector<ll>> G;
  48.  
  49. ll N;
  50. void initN(ll n)
  51. {
  52.     N = 1;
  53.     while (N < n)
  54.         N <<= 1;
  55. }
  56. pll t[1 << 20];
  57.  
  58. pll GetMax(ll v, ll tl, ll tr, ll l, ll r)
  59. {
  60.     if (l > r)
  61.         return mp(-1ll, -1ll);
  62.  
  63.     if (tl == l && tr == r)
  64.         return t[v];
  65.  
  66.     ll tm = (tl + tr) / 2;
  67.  
  68.     pll l1 = GetMax(2 * v, tl, tm, l, min(r, tm));
  69.     pll l2 = GetMax(2 * v + 1, tm + 1, tr, max(l, tm + 1), r);
  70.  
  71.     return max(l1, l2);
  72. }
  73. void update(int v, ll value)
  74. {
  75.     v = N + v;
  76.     t[v] = mp(value, 1ll*v);
  77.  
  78.     while (v > 1)
  79.     {
  80.         v >>= 1;
  81.         t[v] = max(t[2 * v], t[2 * v + 1]);
  82.     }
  83. }
  84. void dfsHeight(ll v = 0, ll height = 0)
  85. {
  86.     T[v].first = timer++;
  87.  
  88.     update(T[v].first, v);
  89.  
  90.     h[v] = height;
  91.     for (int i = 0; i < G[v].size(); ++i)
  92.         dfsHeight(G[v][i], height + 1);
  93.  
  94.     T[v].second = timer - 1;
  95. }
  96.  
  97. bool comp(int a, int b)
  98. {
  99.     return h[a] > h[b];
  100. }
  101. int main()
  102. {
  103. #ifdef _DEBUG
  104.     freopen("input.txt", "rt", stdin);
  105.     freopen("output.txt", "wt", stdout);
  106. #endif
  107.     int turns;
  108.     scanf("%d", &turns);
  109.     for (int turn = 1; turn <= turns; ++turn)
  110.     {
  111.         printf("Case #%d: ", turn);
  112.         ll n, m, A, B;
  113.         scanf("%lld %lld %lld %lld", &n, &m, &A, &B);
  114.  
  115.         G.clear();
  116.         initN(n);
  117.         G.resize(n);
  118.         memset(C, 0, sizeof(C));
  119.         memset(h, 0, sizeof(h));
  120.         memset(T, 0, sizeof(T));
  121.         memset(t, 0, sizeof(t));
  122.         timer = 0;
  123.  
  124.         for (ll i = 0; i < m; ++i)
  125.             C[i] = (A * i + B) % n;
  126.  
  127.         ll ans = 0;
  128.  
  129.         for (ll i = 1; i < n; ++i)
  130.         {
  131.             int p;
  132.             scanf("%d", &p);
  133.             G[p].push_back(i);
  134.         }
  135.         dfsHeight();
  136.         sort(C, C + m, comp);
  137.  
  138.         for (int i = 0; i < m; ++i)
  139.         {
  140.             ll p = C[i];
  141.             pll mx = GetMax(1, 0, N - 1, T[p].first, T[p].second);
  142.             if (mx.first != 0ll)
  143.             {
  144.                 ans += mx.first;
  145.                 update(mx.second - N, 0);
  146.             }
  147.         }
  148.  
  149.         printf("%lld\n", ans);
  150.     }
  151.     ACCEPTED
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement