Advertisement
deadwing97

CHFCH Editorialist

Feb 23rd, 2019
1,081
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MX = (1<<20);
  6.  
  7.  
  8. long long sum[MX];
  9.  
  10. long long get(int l , int r){
  11.  
  12.     if(r < 0 || l > r) return 0;
  13.  
  14.     long long ret = sum[r];
  15.  
  16.     if(l > 0) ret -= sum[l-1];
  17.  
  18.     return ret;
  19.  
  20.  
  21. }
  22.  
  23. long long process(vector < int > v , int K){
  24.  
  25.     long long ret = (1ll << 60);
  26.  
  27.     if(K > v.size()) return ret;
  28.  
  29.     sum[0] = v[0];
  30.  
  31.     sum[v.size()] = 0;
  32.  
  33.     for(int j = 1 ; j < v.size() ; j++)
  34.         sum[j] = v[j] + sum[j-1];
  35.  
  36.     for(int j = 0 ; j + K <= v.size() ; j++){
  37.  
  38.         long long l = j , r = j - 1 + K , mid = (l + r)/2;
  39.  
  40.         long long leftcost = (mid - l) * v[mid] - ((mid - l) * (mid - l + 1))/2 - get(l , mid - 1);
  41.  
  42.         long long rightcost = get(mid + 1 , r) - (r - mid) * v[mid] - ( (r - mid) * (r - mid + 1) / 2);
  43.  
  44.         ret = min(ret , leftcost + rightcost);
  45.  
  46.  
  47.     }
  48.  
  49.     return ret;
  50.  
  51.  
  52. }
  53.  
  54. vector < int > v[MX];
  55.  
  56. int n , arr[MX] , K , T;
  57.  
  58. int main(){
  59.  
  60.     scanf("%d",&T);
  61.  
  62.     while(T--){
  63.  
  64.         scanf("%d %d",&n,&K);
  65.  
  66.         set < int > S;
  67.  
  68.  
  69.         for(int j = 1 ; j <= n ; j++){
  70.             scanf("%d",&arr[j]);
  71.             S.insert(arr[j]);
  72.             v[arr[j]].clear();
  73.         }
  74.  
  75.         for(int j = 1 ; j <= n ; j++){
  76.             v[arr[j]].push_back(j);
  77.         }
  78.  
  79.         long long ans = (1ll << 60);
  80.  
  81.         for(auto x : S)
  82.             ans = min(ans , process(v[x] , K));
  83.  
  84.         if(ans == (1ll << 60)) ans = -1;
  85.  
  86.         cout<<ans<<endl;
  87.  
  88.  
  89.     }
  90.  
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement