Cod sursa(job #1563886)

Utilizator HashiraGrigore Vlad Hashira Data 7 ianuarie 2016 00:07:08
Problema Ferma Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>

#include <vector>
#include <deque>

int main()
{
    std::ifstream fin("ferma.in");
    std::ofstream fout("ferma.out");

    int n, k;

    fin >> n >> k;

    std::vector < int > prod(2 * n + 5);

    for(int i = 1 ; i <= n ; ++i)
    {
        fin >> prod[i];

        prod[i + n] = prod[i];
    }

    std::vector < int > part(2 * n + 5);

    int sol = 0;
    for(int i = 1 ; i <= k ; ++i)
    {
        std::deque < int > dq;

        int ans = -(1 << 30);
        int left, right;

        dq.push_back(0);

        for(int j = 1 ; j < 2 * n ; ++j)
        {
            part[j] = part[j - 1] + prod[j];

            if(!dq.empty() && j - dq.back() == n)
                dq.pop_back();

            if(part[j] - part[dq.back()] > ans)
            {
                ans = part[j] - part[dq.back()];
                left = dq.back() + 1;
                right = j;
            }

            while(!dq.empty() && part[j] <= part[dq.front()])
            {
                dq.pop_front();
            }

            dq.push_front(j);
        }

        for(int j = left ; j <= right ; ++j)
        {
            int l = (j <= n ? j : j - n);

            prod[l] *= -1;
            prod[l + n] *= -1;
        }

        sol += ans;
    }

    fout << sol;

    return 0;
}