fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <set>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. struct T {
  9. const int k, p;
  10. long long m, s, S;
  11. multiset<int> l, b;
  12.  
  13.  
  14. T(vector<int> v) : k{v.size()}, p{k / 2}, s{}, S{} {
  15. sort(v.begin(), v.end());
  16.  
  17. for (int i{0}; i < p; ++i) {
  18. s += v[i];
  19. l.insert(v[i]);
  20. }
  21.  
  22. m = v[p];
  23.  
  24. for (int i{p + 1}; i < k; ++i) {
  25. S += v[i];
  26. b.insert(v[i]);
  27. }
  28. }
  29.  
  30. void delete_and_add(int x, int y) {
  31. if (x == y) return;
  32.  
  33. if (max(x, y) <= m) {
  34. l.erase(l.find(x));
  35. l.insert(y);
  36. s += y - x;
  37. } else if (m <= min(x, y)) {
  38. b.erase(b.find(x));
  39. b.insert(y);
  40. S += y - x;
  41. } else if (x < y) {
  42. l.erase(l.find(x));
  43. l.insert(m);
  44. s += m - x;
  45. m = *b.begin();
  46. b.erase(b.begin());
  47. b.insert(y);
  48. S += y - m;
  49. } else {
  50. b.erase(b.find(x));
  51. b.insert(m);
  52. S += m - x;
  53. m = *prev(l.end());
  54. l.erase(prev(l.end()));
  55. l.insert(y);
  56. S += y - m;
  57. }
  58. }
  59.  
  60. long long med() const {
  61. return m * k - s + S;
  62. }
  63. };
  64.  
  65. int main() {
  66. ios_base::sync_with_stdio(false);
  67.  
  68. int n, k;
  69.  
  70. cin >> n >> k;
  71.  
  72. if (k == 1) {
  73. cout << 0 << endl;
  74.  
  75. return 0;
  76. }
  77.  
  78. vector<int> h(n);
  79.  
  80. for (auto& x: h) {
  81. cin >> x;
  82. }
  83.  
  84. if (k == 2) {
  85. int res{abs(h[0] - h[1])};
  86.  
  87. for (int i{1}; i < n - 1; ++i) {
  88. res = min(res, abs(h[i] - h[i + 1]));
  89. }
  90.  
  91. cout << res << endl;
  92.  
  93. return 0;
  94. }
  95.  
  96.  
  97.  
  98. T t(vector<int>(h.begin(), h.begin() + k));
  99.  
  100. long long res{t.med()};
  101.  
  102. return 0;
  103.  
  104. for (int i{k}; k < n; ++i) {
  105. t.delete_and_add(h[i - k], h[i]);
  106. res = min(res, t.med());
  107. }
  108.  
  109. cout << res << endl;
  110.  
  111. return 0;
  112. }
Success #stdin #stdout 0s 15240KB
stdin
5 3
3
9
2
3
1
stdout
Standard output is empty