Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. size_t Partition(std::vector<size_t> &data, std::vector<size_t> &data_index,
  6. size_t left_range, size_t right_range) {
  7. size_t pivot = data[left_range];
  8. size_t left = left_range - 1;
  9. size_t right = right_range + 1;
  10. while (right >= 0) {
  11. do {
  12. ++left;
  13. } while (data[left] < pivot);
  14.  
  15. do {
  16. --right;
  17. } while (data[right] > pivot);
  18.  
  19. if (left >= right) {
  20. break;
  21. }
  22. std::swap(data[left], data[right]);
  23. std::swap(data_index[left], data_index[right]);
  24. }
  25. return right;
  26. }
  27.  
  28.  
  29. void Qsort(std::vector<size_t> &data, std::vector<size_t> &data_index, size_t left_range,
  30. size_t right_range) {
  31. if (left_range < right_range) {
  32. size_t index = Partition(data, data_index, left_range, right_range);
  33. Qsort(data, data_index, left_range, index);
  34. Qsort(data, data_index, index + 1, right_range);
  35. }
  36. }
  37.  
  38.  
  39. void Solve(std::vector<size_t> &data, std::vector<size_t> &data_index) {
  40.  
  41. size_t left_range = 0, left_change = 0, right_range = 1;
  42. if (data.size() == 1) {
  43. std::cout << data[0] << "\n" << 1;
  44. return;
  45. }
  46.  
  47. int64_t sum_avg = data[0] + data[1], sum_res = data[0] + data[1];
  48.  
  49. for (size_t index = 2; index < data.size(); ++index) {
  50.  
  51. while (data[left_change] + data[left_change + 1] < data[index] && left_change < index) {
  52. sum_avg -= data[left_change];
  53. ++left_change;
  54. }
  55.  
  56. sum_avg += data[index];
  57.  
  58. if (sum_avg > sum_res) {
  59. sum_res = sum_avg;
  60. left_range = left_change;
  61. right_range = index;
  62. }
  63. }
  64.  
  65. Qsort(data_index, data, left_range, right_range);
  66.  
  67. std::cout << sum_res << "\n";
  68. for (size_t index = left_range; index <= right_range; ++index) {
  69. std::cout << data_index[index] + 1 << " ";
  70. }
  71. }
  72.  
  73. int main() {
  74. std::ios_base::sync_with_stdio(false);
  75. size_t count;
  76. std::cin >> count;
  77. std::vector<size_t> data(count);
  78. std::vector<size_t> data_index(count);
  79. for (size_t i = 0; i < count; ++i) {
  80. std::cin >> data[i];
  81. data_index[i] = i;
  82. }
  83.  
  84. Qsort(data, data_index, 0, data.size() - 1);
  85.  
  86. Solve(data, data_index);
  87.  
  88. return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement