fork download
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define X first
  6. #define Y second
  7.  
  8. int main()
  9. {
  10. int n, k;
  11.  
  12. cin >> n >> k;
  13.  
  14. int a[n], maxi = INT_MIN;
  15.  
  16. map<int, int> mp;
  17.  
  18. for(int i = 0; i < n ; i++)
  19. {
  20. cin >> a[i];
  21.  
  22. mp[a[i]]++;
  23. }
  24.  
  25. int ans = INT_MAX;
  26. vector<int> poss;
  27. map<int, int> pushed;
  28.  
  29. // sort(a, a + n);
  30.  
  31. map<int, vector<pair<int, int> > > div;
  32.  
  33. for(auto it = mp.begin(); it != mp.end(); it++)
  34. {
  35. int num = it->first, cnt = 0;
  36.  
  37. if(pushed.find(num) == pushed.end())
  38. {
  39. poss.push_back(num);
  40. pushed[num] = 1;
  41. }
  42.  
  43. while(num > 0)
  44. {
  45. num /= 2;
  46.  
  47. if(pushed.find(num) == pushed.end())
  48. {
  49. poss.push_back(num);
  50. pushed[num] = 1;
  51. }
  52.  
  53. cnt++;
  54. div[num].push_back(make_pair(it->first, cnt));
  55. }
  56.  
  57. if(pushed.find(num) == pushed.end())
  58. {
  59. poss.push_back(num);
  60. pushed[num] = 1;
  61. }
  62. div[num].push_back(make_pair(it->first, cnt));
  63. }
  64.  
  65. // cout << poss.size() << "\n";
  66.  
  67. sort(poss.begin(), poss.end());
  68.  
  69. for(int x = 0; x < poss.size(); x++)
  70. {
  71. int i = poss[x];
  72.  
  73. // cout << "for " << poss[k] << "\n";
  74.  
  75. if(mp.find(i) == mp.end())
  76. mp[i] = 0;
  77.  
  78. if(mp[i] >= k)
  79. {
  80. ans = 0;
  81. break;
  82. }
  83.  
  84. int tot = mp[i], temp = 0, j = 0;
  85.  
  86. while(tot < k && j < div[i].size())
  87. {
  88. pair<int, int> det = div[i][j];
  89.  
  90. if(det.X != i)
  91. {
  92. if(tot + mp[det.X] < k)
  93. {
  94. temp += mp[det.X] * det.Y;
  95. tot += mp[det.X];
  96. }
  97. else
  98. {
  99. temp += (min(mp[det.X], k - tot) * det.Y);
  100. tot = k;
  101. }
  102. }
  103. }
  104.  
  105. if(tot == k)
  106. ans = min(ans, temp);
  107. }
  108.  
  109. cout << ans << "\n";
  110.  
  111. return 0;
  112. }
Success #stdin #stdout 0s 4172KB
stdin
5 3
1 2 3 3 3
stdout
0