Advertisement
a53

Caesar Legions

a53
Sep 17th, 2021
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <unordered_map>
  3. using namespace std;
  4. ifstream fin("caesar.in");
  5. ofstream fout("caesar.out");
  6. struct my_rmq {
  7. long long mini;
  8. long long maxi;
  9. };
  10. vector<long long> lg;
  11. vector<vector<my_rmq>> rmq;
  12. long long query(long long st, long long dr, bool maxim) {
  13. long long pow_2 = lg[dr - st + 1];
  14. if (maxim) {
  15. return max(rmq[st][pow_2].maxi, rmq[dr - (1 << (pow_2)) + 1][pow_2].maxi);
  16. }
  17. else {
  18. return min(rmq[st][pow_2].mini, rmq[dr - (1 << (pow_2)) + 1][pow_2].mini);
  19. }
  20. }
  21. int main() {
  22. long long n;
  23. fin >> n;
  24. vector<long long> a(n + 1);
  25. for (long long i = 1; i <= n; ++i) {
  26. fin >> a[i];
  27. }
  28. lg = vector<long long>(n + 1);
  29. for (long long i = 2; i <= n; ++i) {
  30. lg[i] = lg[i / 2] + 1;
  31. }
  32. rmq = vector<vector<my_rmq>>(n + 1, vector<my_rmq>(lg[n] + 1));
  33. map<long long, long long> left;
  34. map<long long, long long> right;
  35. for (long long i = 1; i <= n; ++i) {
  36. right[a[i]] = i;
  37. }
  38. for (long long i = n; i >= 1; --i) {
  39. left[a[i]] = i;
  40. }
  41. vector<long long> st(n + 1);
  42. vector<long long> dr(n + 1);
  43. for (long long i = 1; i <= n; ++i) {
  44. st[i] = left[a[i]];
  45. }
  46. for (long long i = 1; i <= n; ++i) {
  47. dr[i] = right[a[i]];
  48. }
  49. for (long long i = 1; i <= n; ++i) {
  50. rmq[i][0].mini = st[i];
  51. rmq[i][0].maxi = dr[i];
  52. }
  53. for (long long j = 1; j <= lg[n]; ++j) {
  54. for (long long i = 1; i + (1 << j) - 1 <= n; ++i) {
  55. rmq[i][j].maxi = max(rmq[i][j - 1].maxi, rmq[i + (1 << (j - 1))][j - 1].maxi);
  56. rmq[i][j].mini = min(rmq[i][j - 1].mini, rmq[i + (1 << (j - 1))][j - 1].mini);
  57. }
  58. }
  59. vector<long long> dp(n + 1);
  60. dp[n] = 1;
  61. map<long long, long long> closest;
  62. closest[dr[n]] = n;
  63. for (long long i = n - 1; i >= 1; --i) {
  64. long long maxi = query(i, dr[i], true);
  65. if (maxi == dr[i]) {
  66. dp[i] = dr[i] - i + 1;
  67. }
  68. else {
  69. dp[i] = closest[maxi] - i + dp[closest[maxi]];
  70. }
  71. closest[dr[i]] = i;
  72. }
  73. vector<long long> cnt(n + 2);
  74. for (long long i = n; i >= 1; --i) {
  75. if (query(i, i + dp[i] - 1, false) >= i) {
  76. cnt[i] = 1 + cnt[i + dp[i]];
  77. }
  78. }
  79. long long ans = 0;
  80. for (long long i = 1; i <= n; ++i) {
  81. ans += cnt[i];
  82. }
  83. fout << ans;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement