Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <deque>
- #include <vector>
- #include <algorithm>
- int main() {
- int columns_amount, segment_len;
- std::cin >> columns_amount >> segment_len;
- std::vector<int> num_list(columns_amount);
- int64_t segment_sum = 0;
- for (int index = 0; index < columns_amount; ++index) {
- std::cin >> num_list[index];
- }
- std::deque<int> my_deque;
- std::vector<std::pair<int64_t, std::vector<int>>> bl(segment_len + 2);
- for (int index = 0; index < columns_amount; ++index) {
- segment_sum += num_list[index];
- if (index >= segment_len) {
- segment_sum -= num_list[index - segment_len];
- if (my_deque.front() == index - segment_len) {
- my_deque.pop_front();
- }
- }
- while (!my_deque.empty() && num_list[my_deque.back()] >= num_list[index]) {
- my_deque.pop_back();
- }
- my_deque.push_back(index);
- if (index >= segment_len - 1) {
- auto index_prev = (index - 1) % (segment_len + 1);
- auto index_k_prev = (index - segment_len) % (segment_len + 1);
- auto index_current = index % (segment_len + 1);
- int64_t protection = num_list[my_deque.front()] * segment_sum;
- std::pair<int64_t, std::vector<int>> another = {bl[index_k_prev].first + protection, bl[index_k_prev].second};
- another.second.push_back(index - segment_len + 2);
- bl[index_current] = std::max(bl[index_prev], another);
- }
- }
- auto max_elem = bl.begin();
- for (auto it = bl.begin(); it != bl.end(); ++it) {
- if (it->first > max_elem->first) {
- max_elem = it;
- }
- }
- std::cout << max_elem->second.size() << "\n";
- for (auto element : max_elem->second) {
- std::cout << element << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement