Cod sursa(job #3031185)

Utilizator preda.andreiPreda Andrei preda.andrei Data 18 martie 2023 22:44:10
Problema Subsecventa de suma maxima Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>

using namespace std;

struct Sol {
    int sum;
    int left;
    int right;

    void Update(int new_sum, int new_left, int new_right) {
        int len = right - left + 1;
        int new_len = new_right - new_left + 1;

        auto change = new_sum > sum ||
                      (new_sum == sum && (new_left < left ||
                                          (new_left == left && new_len < len)));
        if (change) {
            sum = new_sum;
            left = new_left;
            right = new_right;
        }
    }
};

Sol Solve(const vector<int>& vec) {
    Sol sol;
    sol.sum = vec[0];
    sol.left = sol.right = 0;

    int l = 0;
    int sum = 0;

    for (size_t i = 0; i < vec.size(); i += 1) {
        sum = max(vec[i], sum + vec[i]);
        sol.Update(sum, l, i);
        if (sum < 0) {
            l = i + 1;
            sum = 0;
        }
    }
    return sol;
}

int main() {
    ifstream fin("ssm.in");
    ofstream fout("ssm.out");

    int n;
    fin >> n;

    vector<int> vec(n);
    for (auto& num : vec) {
        fin >> num;
    }

    auto res = Solve(vec);
    fout << res.sum << " " << res.left + 1 << " " << res.right + 1 << "\n";
    return 0;
}