Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. int n;
  6. const int maxN = (int)1e7 + 10;
  7. int nxt[maxN], prv[maxN];
  8. int fenw[maxN];
  9. void upd(int v, int d) {
  10. while (v <= n + 1) {
  11. fenw[v] += d;
  12. v = (v | (v - 1)) + 1;
  13. }
  14. }
  15. int get(int v) {
  16. int ans = 0;
  17. while (v > 0) {
  18. ans += fenw[v];
  19. v &= (v - 1);
  20. }
  21. return ans;
  22. }
  23. int upperBound(int sum) {
  24. int cur = 1;
  25. for (int i = 24; i >= 0; i--) {
  26. int ncur = cur + (1 << i) - 1;
  27. if (ncur <= n + 1 && fenw[ncur] <= sum) {
  28. sum -= fenw[ncur];
  29. cur = ncur + 1;
  30. }
  31. }
  32. return cur;
  33. }
  34. int main() {
  35. //freopen("input.txt", "r", stdin);
  36. ios_base::sync_with_stdio(false);
  37. //cin >> n;
  38. n = (int)1e7;
  39. vector < pair < int, int > > all;
  40. for (int i = 1; i <= n; i++) {
  41. //cin >> a[i];
  42. int x = i % 237 + 23 * i % 8;
  43. cin >> x;
  44. all.emplace_back(x, i);
  45. }
  46. sort(all.begin(), all.end());
  47. reverse(all.begin(), all.end());
  48. set < int > s;
  49. s.insert(0);
  50. s.insert(n + 1);
  51. ll ans = 0;
  52. nxt[0] = n + 1;
  53. prv[n + 1] = 0;
  54. nxt[n + 1] = n + 1;
  55. prv[0] = 0;
  56. upd(n + 1, 1);
  57. for (auto it : all) {
  58. int ind = it.second;
  59. int pos3 = upperBound(get(ind));
  60. int pos4 = nxt[pos3];
  61. int pos2 = prv[pos3];
  62. int pos1 = prv[pos2];
  63. nxt[pos2] = ind;
  64. prv[ind] = pos2;
  65. prv[pos3] = ind;
  66. nxt[ind] = pos3;
  67. upd(ind, 1);
  68. if (pos2 == 0 && pos3 == n + 1) continue;
  69. ans += 1LL * it.first * (pos4 - pos3) * (ind - pos2) + (pos2 - pos1) * (pos3 - ind);
  70. }
  71. cout << ans;
  72. return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement