Advertisement
a53

Pikachu

a53
Dec 27th, 2021
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <cstdlib>
  5. #include <algorithm>
  6. using namespace std;
  7. #define MAXN 100100
  8. #define MAXARB (1 << 18)
  9. #define pb push_back
  10. #define mp make_pair
  11. #define PII pair<int, int>
  12. #define left (nod<<1)
  13. #define right ((nod<<1) | 1)
  14. #define mid ((st+dr) >> 1)
  15. #define llong long long
  16. int N, K, sir[MAXN], arb[MAXARB], med[MAXN];
  17. vector<int> A;
  18. llong res;
  19. llong arb2[MAXARB];
  20.  
  21. int getindex(int x)
  22. {
  23. return (int)(lower_bound(A.begin(), A.end(), x)-A.begin());
  24. }
  25.  
  26. int query(int nod, int st, int dr, int k)
  27. {
  28. if(st == dr)
  29. return st;
  30. if(arb[left] >= k) return query(left, st, mid, k);
  31. return query(right, mid+1, dr, k-arb[left]);
  32. }
  33.  
  34. void update(int nod, int st, int dr, int k, int sgn)
  35. {
  36. arb[nod]+=sgn;
  37. if(st == dr)
  38. return ;
  39. if(k <= mid) update(left, st, mid, k, sgn);
  40. else update(right, mid+1, dr, k, sgn);
  41. }
  42.  
  43. void update2(int nod, int st, int dr, int k, int sgn)
  44. {
  45. arb[nod]+=sgn;
  46. arb2[nod] += (llong)sgn*A[k];
  47. if(st == dr) return ;
  48. if(k <= mid) update2(left, st, mid, k, sgn);
  49. else update2(right, mid+1, dr, k, sgn);
  50. }
  51.  
  52. llong sum(int nod, int st, int dr, int k)
  53. {
  54. if(st == dr) return arb2[nod];
  55. if(arb[left] >= k) return sum(left, st, mid, k);
  56. return arb2[left]+sum(right, mid+1, dr, k-arb[left]);
  57. }
  58.  
  59. void solve(void)
  60. {
  61. int i, j, k, s, lamisto;
  62. llong aux, aux2;
  63. sort(A.begin(), A.end());
  64. for(i = 0; i < K; i++)
  65. update(1, 0, N-1, getindex(sir[i]), +1);
  66. if(K%2 == 1) s = 1;
  67. else s = 0;
  68. med[0] = A[query(1, 0, N-1, K/2+s)];
  69. for(i = 1; i+K-1 < N; i++)
  70. {
  71. int ttt = getindex(sir[i-1]);
  72. int qqq = getindex(sir[i+K-1]);
  73. update(1, 0, N-1, getindex(sir[i-1]), -1);
  74. update(1, 0, N-1, getindex(sir[i+K-1]), +1);
  75. med[i] = A[query(1, 0, N-1, K/2+s)];
  76. }
  77. for(i = 0; i < MAXARB; i++) arb[i] = 0;
  78. for(i = 0; i < K; i++)
  79. update2(1, 0, N-1, getindex(sir[i]), +1);
  80. if(K%2 == 0) lamisto = 1;
  81. else lamisto = 0;
  82. aux = sum(1, 0, N-1, K/2-lamisto), aux2 = sum(1, 0, N-1, K)-med[0];
  83. res = (llong)med[0]*(K/2-lamisto)-aux;
  84. res += (llong)(aux2-aux)-med[0]*(llong)(K/2);
  85. for(i = 1; i+K-1 < N; i++)
  86. {
  87. update2(1, 0, N-1, getindex(sir[i-1]), -1);
  88. update2(1, 0, N-1, getindex(sir[i+K-1]), +1);
  89. aux = sum(1, 0, N-1, K/2-lamisto), aux2 = sum(1, 0, N-1, K)-med[i];
  90. llong q;
  91. q = (llong)med[i]*(K/2-lamisto)-aux; q += (llong)(aux2-aux)-med[i]*(llong)(K/2);
  92. res = min(res, q);
  93. }
  94. }
  95.  
  96. int main(void)
  97. {
  98. freopen("pikachu.in","rt",stdin);
  99. freopen("pikachu.out","wt",stdout);
  100. scanf("%d %d", &N, &K);
  101. for(int i=0;i<N;++i)
  102. scanf("%d",&sir[i]),A.pb(sir[i]);
  103. solve();
  104. printf("%lld\n",res);
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement