Advertisement
TwITe

Untitled

Jan 6th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.20 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. using ull = unsigned long long;
  5. const ll MAX = LONG_LONG_MAX;
  6.  
  7. struct min_sum_struct { // структура только для минимальной суммы элемента
  8.     ll min_sum = MAX;
  9.     int l; // левая граница
  10. };
  11.  
  12. struct sum_struct { // структура для сумм на отрезках
  13.     ll sum = -MAX;
  14.     int r; // левая граница
  15.     int l; // правая граница
  16. };
  17.  
  18. void solve() {
  19.     int n;
  20.     cin >> n;
  21.     vector<ll> v(n);
  22.     ll sum[n + 1]; // частичные суммы
  23.     sum[0] = 0;
  24.     ll max_element = -MAX;
  25.     map<ll, min_sum_struct> min_sums; // тут хранится минимальная сумма
  26.     map<ll, sum_struct> sums; // тут хранится максимальная суммы на отрезке
  27.     int max_elem_pos; // позиция максимального элемента
  28.     for (int i = 0; i < n; i++) {
  29.         cin >> v[i];
  30.         sum[i + 1] = sum[i] + v[i];
  31.         if (v[i] > max_element) {
  32.             max_element = v[i];
  33.             max_elem_pos = i;
  34.         }
  35.         if (min_sums.find(v[i]) != min_sums.end()) { // если минимальная сумма уже есть, и снова встретился тот же элемент
  36.         //  то посчитаем сумму на данном отрезке (текущий индекс - индекс минимальной суммы)
  37.             ll current_sum = sum[i + 1] - min_sums[v[i]].min_sum;
  38.             if (current_sum > sums[v[i]].sum) {
  39.                 sums[v[i]].sum = current_sum;
  40.                 sums[v[i]].r = i;
  41.                 sums[v[i]].l = min_sums[v[i]].l;
  42.             }
  43.         }
  44.         if (sum[i] < min_sums[v[i]].min_sum) { // устанавливаем минимальуную встретившуюся сумму
  45.             min_sums[v[i]].min_sum = sum[i];
  46.             min_sums[v[i]].l = i;
  47.         }
  48.     }
  49.     ll answer = -MAX;
  50.     int answer_left_pos, answer_right_pos; // границы искомого отрезка
  51.     for (auto it = sums.begin(); it != sums.end(); it++) { // будем проходить по мапе, и искать наибольшую сумму на отрезках
  52.         // также, если элемент не встречался во 2-й раз, то его в мапе не будет,соответсвенно их рассматривать даже не будем
  53.         ll current_sum = it->second.sum;
  54.         if (current_sum > answer) {
  55.             answer = current_sum;
  56.             answer_right_pos = it->second.r;
  57.             answer_left_pos = it->second.l;
  58.         }
  59.     }
  60.     if (answer >= max_element) {
  61.         cout << answer << endl << answer_left_pos + 1 << " " << answer_right_pos + 1;
  62.     }
  63.     else { // если наибольшая сумма на каком-то из отрезков оказалась меньше единичного числа, то выводим максимальное число              // и его позиции
  64.         cout << max_element << endl << max_elem_pos + 1 << " " << max_elem_pos + 1;
  65.     }
  66. }
  67.  
  68. int main() {
  69.     solve();
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement