Cod sursa(job #2806244)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 14:32:56
Problema Buline Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb

#include <stdio.h>

using namespace std;
FILE* f, * g;

int v[500004];
int main()
{
    int n, i, nr, xx, li1 = 1, lf1 = 1, so1 = -999999999, si1 = 0, lg1 = 0, tot = 0, poz, li2 = 1, lf2 = 1, so2 = 999999999, si2 = 0, lg2 = 0, lg;
    f = fopen("buline.in", "r");
    g = fopen("buline.out", "w");
    fscanf(f, "%d", &n);
    for (i = 1;i <= n;i++)
    {
        fscanf(f, "%d %d", &v[i], &xx);
        if (xx == 0)
            v[i] = v[i] * (-1);
        v[n + i] = v[i];
        tot += v[i];
    }
    poz = 1;
    for (i = 1;i <= 2 * n;i++)///1
    {
        if (si1 < 0)
        {
            if (i > n)
                break;
            si1 = v[i], poz = i;
        }
        else
            si1 += v[i];
        if (si1 > so1 && i - li1 + 1 <= n)
        {
            so1 = si1;
            li1 = poz;
            lf1 = i;
        }
    }
    lg1 = lf1 - li1 + 1;///lungimea sumei de secventa maxima
    poz = 1;

    for (i = 1;i <= 2 * n;i++)
    {
        if (si2 > 0)
        {
            if (i > n)
                break;
            si2 = v[i], poz = i;
        }
        else
            si2 += v[i];
        if (si2 < so2 && i - li2 + 1 <= n)
        {
            so2 = si2;
            li2 = poz;
            lf2 = i;
        }
    }
    lg2 = lf2 - li2 + 1;///lungimea sumei de secventa minima
    lg = n - lg2;
    if (tot - so2 > so1 && lg != 0)///daca am gasit o secventa de lungime maxima mai mare decat cea determinata la 1
    {
        so1 = tot - so2;
        li1 = lf2 + 1;
        lg1 = lg;
    }
    fprintf(g, "%d %d %d", so1, li1, lg1);

    fclose(f);
    fclose(g);
    return 0;
}