Guest User

Untitled

a guest
Oct 5th, 2024
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int n, k, a[100005], prv[100005];
  6.  
  7. struct sgtn
  8. {
  9. int mnm = 0, lazy = 0, cntmin;
  10. };
  11.  
  12. sgtn aint[20][400005];
  13.  
  14. void build(int nod, int l, int r)
  15. {
  16. for (int i = 1; i < (1 << k); i++)
  17. aint[i][nod].mnm = aint[i][nod].lazy = 0, aint[i][nod].cntmin = r - l + 1;
  18. if (l != r)
  19. {
  20. int mij = (l + r) / 2;
  21. build(2 * nod, l, mij);
  22. build(2 * nod + 1, mij + 1, r);
  23. }
  24. }
  25.  
  26. void prop(int mask, int nod, int l, int r)
  27. {
  28. if (l != r)
  29. {
  30. int lz = aint[mask][nod].lazy;
  31. aint[mask][2 * nod].mnm += lz;
  32. aint[mask][2 * nod].lazy += lz;
  33. aint[mask][2 * nod + 1].mnm += lz;
  34. aint[mask][2 * nod + 1].lazy += lz;
  35. }
  36. aint[mask][nod].lazy = 0;
  37. }
  38.  
  39. void update(int mask, int nod, int l, int r, int st, int dr, int val)
  40. {
  41. //if (nod == 1)
  42. // cout << mask << ' ' << st << ' ' << dr << ' ' << val << endl;
  43. prop(mask, nod, l, r);
  44. if (r < st or dr < l)
  45. return;
  46. if (st <= l and r <= dr)
  47. {
  48. aint[mask][nod].mnm += val;
  49. aint[mask][nod].lazy += val;
  50. return;
  51. }
  52. int mij = (l + r) / 2;
  53. update(mask, 2 * nod, l, mij, st, dr, val);
  54. update(mask, 2 * nod + 1, mij + 1, r, st, dr, val);
  55. if (aint[mask][2 * nod].mnm < aint[mask][2 * nod + 1].mnm)
  56. aint[mask][nod].mnm = aint[mask][2 * nod].mnm, aint[mask][nod].cntmin = aint[mask][2 * nod].cntmin;
  57. else if (aint[mask][2 * nod].mnm > aint[mask][2 * nod + 1].mnm)
  58. aint[mask][nod].mnm = aint[mask][2 * nod + 1].mnm, aint[mask][nod].cntmin = aint[mask][2 * nod + 1].cntmin;
  59. else
  60. aint[mask][nod].mnm = aint[mask][2 * nod].mnm, aint[mask][nod].cntmin = aint[mask][2 * nod].cntmin + aint[mask][2 * nod + 1].cntmin;
  61. }
  62.  
  63. pair<int,int> query(int mask, int nod, int l, int r, int st, int dr)
  64. {
  65. prop(mask, nod, l, r);
  66. if (r < st or dr < l)
  67. return {1e9, 0};
  68. else if (st <= l and r <= dr)
  69. return {aint[mask][nod].mnm, aint[mask][nod].cntmin};
  70. int mij = (l + r) / 2;
  71. pair<int, int> p1 = query(mask, 2 * nod, l, mij, st, dr);
  72. pair<int, int> p2 = query(mask, 2 * nod + 1, mij + 1, r, st, dr);
  73. if (p1.first < p2.first)
  74. return p1;
  75. else if (p1.first > p2.first)
  76. return p2;
  77. else
  78. return {p1.first, p1.second + p2.second};
  79. }
  80.  
  81. int main()
  82. {
  83. ios_base::sync_with_stdio(false);
  84. cin.tie(NULL);
  85. cout.tie(NULL);
  86. cin >> n >> k;
  87. for (int i = 1; i <= n; i++)
  88. cin >> a[i];
  89. build(1, 1, n);
  90. map<int, int> prea;
  91. for (int i = 1; i <= n; i++)
  92. {
  93. prv[i] = prea[a[i]];
  94. prea[a[i]] = i;
  95. }
  96. long long ans = 0;
  97. for (int i = 1; i <= n; i++)
  98. {
  99. for (int j = 1; j <= k; j++)
  100. {
  101. int x = i;
  102. for (int q = 1; q < j; q++)
  103. x = prv[x];
  104. if (x == 0)
  105. continue;
  106. int xx = x;
  107. for (int mask = 1; mask < (1 << k); mask++)
  108. {
  109. x = xx;
  110. if (mask & (1 << (j - 1)))
  111. {
  112. update(mask, 1, 1, n, prv[x] + 1, x, 1);
  113. x = prv[x];
  114. if (x != 0)
  115. update(mask, 1, 1, n, prv[x] + 1, x, -1);
  116. }
  117. }
  118. }
  119. int adg = i;
  120. for (int mask = 1; mask < (1 << k); mask++)
  121. {
  122. pair<int, int> pp = query(mask, 1, 1, n, 1, i);
  123. int df = 0;
  124. if (pp.first == 0)
  125. df = pp.second;
  126. //if (i == 1)
  127. //cout << mask << ' ' << df << endl;
  128. if ((int)(__builtin_popcount(mask)) % 2 == 1)
  129. df = -df;
  130. adg += df;
  131. }
  132. //cout << adg << endl;
  133. ans += adg;
  134. }
  135. cout << ans;
  136. return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment