Advertisement
Guest User

Untitled

a guest
Oct 25th, 2014
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <algorithm>
  4. #include <climits>
  5. using namespace std;
  6.  
  7. #define mp make_pair
  8.  
  9. const int MAX_N = 212345;
  10.  
  11. struct cmp {
  12. bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
  13. return (a.first < b.first) || (a.first == b.first && a.second > b.second);
  14. }
  15. };
  16.  
  17. int N, K, a[MAX_N], d = 0, min_val = INT_MAX;
  18. multiset<pair<int, int>, cmp> SET;
  19.  
  20. int main() {
  21. ios_base::sync_with_stdio(0);
  22.  
  23. cin >> N >> K;
  24. for(int i = 0; i < N; ++i) {
  25. cin >> a[i];
  26. min_val = min(min_val, a[i]);
  27. }
  28.  
  29. int cur_sum = 0;
  30. for(int i = 0; i < K; ++i) {
  31. SET.insert(mp(a[i], i));
  32. cur_sum += a[i];
  33. }
  34.  
  35. int l = 0, r = K-1;
  36. while(r < N) {
  37. if(cur_sum >= 0) {
  38. multiset<pair<int, int> >::iterator it = SET.begin();
  39. while(cur_sum >= 0) {
  40. int min_elem_val = it->first, min_elem_idx = it->second;
  41. if(l <= min_elem_idx && min_elem_idx <= r && a[min_elem_idx] == min_elem_val) {
  42. int diff_need = cur_sum+1;
  43. int diff_can = min_elem_val - min_val;
  44. int diff_do = min(diff_need, diff_can);
  45. a[min_elem_idx] -= diff_do;
  46. d += diff_do;
  47. cur_sum -= diff_do;
  48. it++;
  49.  
  50. if(diff_do > 0)
  51. SET.insert(mp(a[min_elem_idx], min_elem_idx));
  52. } else {
  53. if(it != SET.end()) {
  54. multiset<pair<int, int> >::iterator del_it(it);
  55. it++;
  56. SET.erase(del_it);
  57. }
  58. }
  59. }
  60. }
  61.  
  62. cur_sum -= a[l];
  63. if(r+1 < N) {
  64. cur_sum += a[r+1];
  65. SET.insert(mp(a[r+1], r+1));
  66. }
  67.  
  68. l++, r++;
  69. }
  70.  
  71. cout << d << '\n';
  72. for(int i = 0; i < N; ++i)
  73. cout << a[i] << ' ';
  74. cout << '\n';
  75.  
  76. return 0;
  77. }
  78.  
  79. /*
  80. 6 1
  81. 0 0 0 0 0 -1
  82. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement