Advertisement
Guest User

Sum.cpp

a guest
Nov 18th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <set>
  5. #include <map>
  6. #include <functional>
  7. #include <algorithm>
  8. #include <stack>
  9. #include <queue>
  10. #include <cmath>
  11. #include <cctype>
  12. #include <cstdio>
  13.  
  14. using namespace std;
  15.  
  16. typedef long long int64;
  17. typedef unsigned uint;
  18.  
  19. #define mp make_pair
  20. int64 n, k;
  21.  
  22. int64 merge(vector <int64> &v, int l, int r) {
  23. int m = (l + r) / 2;
  24. vector <pair<int64, bool>> a;
  25. int i = l, j = m + 1;
  26. int64 sum = 0;
  27. int64 s = 0;
  28. int k1 = 0;
  29. while (i <= m || j <= r) {
  30. if (i > m) {
  31. while (k1 < (int) a.size() && v[j] - a[k1].first >= k) {
  32. if (!a[k1].second) s++;
  33. k1++;
  34. }
  35. sum += s;
  36. a.push_back(mp(v[j], 1));
  37. j++;
  38. continue;
  39. }
  40. if (j > r) {
  41. // sum += find(a, v[i]-k);
  42. a.push_back(mp(v[i], 0));
  43. i++;
  44. continue;
  45. }
  46. if (v[i] <= v[j]) {
  47. // sum += find(a,v[i]-k);
  48. a.push_back(mp(v[i], 0));
  49. i++;
  50. } else {
  51. while (k1 < (int) a.size() && v[j] - a[k1].first >= k) {
  52. if (!a[k1].second) s++;
  53. k1++;
  54. }
  55. sum += s;
  56. a.push_back(mp(v[j], 1));
  57. j++;
  58. }
  59. }
  60. for (int i = l; i <= r; ++i) {
  61. v[i] = a[i - l].first;
  62. }
  63.  
  64. return sum;
  65. }
  66.  
  67. int64 MergeSort(vector <int64> &v, int l, int r) {
  68. if (l >= r) return 0;
  69. int m = (l + r) / 2;
  70. int64 sum = MergeSort(v, l, m);
  71. sum += MergeSort(v, m + 1, r);
  72. sum += merge(v, l, r);
  73. return sum;
  74. }
  75.  
  76. unsigned int cur = 0;
  77. unsigned int a, b;
  78.  
  79. unsigned int next24() {
  80. cur = cur * a + b;
  81. return cur >> 8;
  82. }
  83.  
  84. unsigned int next() {
  85. unsigned int a = next24(), b = next24();
  86. return (a << 8) ^ b;
  87. }
  88.  
  89.  
  90. int main() {
  91. // freopen("read.txt", "r", stdin);
  92. freopen("bigseg.in", "r", stdin);
  93. freopen("bigseg.out", "w", stdout);
  94. cin >> n >> k;
  95. cin >> a >> b;
  96. vector <int64> v(n);
  97. for (int i = 0; i < n; ++i) {
  98. v[i] = (int64)((int)next());
  99. // cin >> v[i];
  100. }
  101. vector <int64> p;
  102. p.push_back(0);
  103. for (int i = 0; i < n; ++i) {
  104. p.push_back(p.back() + v[i]);
  105. }
  106. cout << MergeSort(p, 0, (int)p.size() - 1) << endl;;
  107. return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement