Cod sursa(job #2733247)

Utilizator maria_neagoieMaria Neagoie maria_neagoie Data 30 martie 2021 10:11:12
Problema Buline Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <cstdio>
using namespace std;
const int NMAX=200005;
int v[NMAX];
int main()
{
    freopen("buline.in","r",stdin);
    freopen("buline.out","w",stdout);
    int n,i,x,sc,smax,st,dr,stmax,drmax,culoare,lmax,smin,drmin,stmin,s=0,smax2,stmax2,lmax2,drmax2;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&x,&culoare);
        if(culoare==0) //negru
            v[i]=-x;
        else //alb
            v[i]=x;
        s=s+v[i];
    }
    //secv de suma maxima pe dreapta de la 1 la n
    sc=smax=v[1];
    st=stmax=drmax=1;
    for(dr=2;dr<=n;dr++)
    {
        if((sc+v[dr])>=v[dr])
            sc=sc+v[dr];
        else
        {
            sc=v[dr];
            st=dr;
        }
        if(sc>smax)
        {
            smax=sc;
            stmax=st;
            drmax=dr;
        }
    }
    lmax=drmax-stmax+1;
    //secv minima pe dreapta pe care putem sa o scoatem si ramanem cu o secv circulara cat mai mare
    sc=smin=v[1];
    st=stmin=drmin=1;
    for(dr=2;dr<=n;dr++)
    {
        if((sc+v[dr])<v[dr])
            sc=sc+v[dr];
        else
        {
            sc=v[dr];
            st=dr;
        }
        if(sc<smin)
        {
            smin=sc;
            stmin=st;
            drmin=dr;
        }
    }
    smax2=s-smin;
    stmax2=drmin+1;
    drmax2=stmin-1;
    lmax2=drmax2+n-stmax+1;
    if(smax>smax2)
        printf("%d %d %d",smax,stmax,lmax);
    else
    {
        if(smax2>smax)
            printf("%d %d %d",smax2,stmax2,lmax2);
        else
        {
            if(stmax<stmax2)
                printf("%d %d %d",smax,stmax,lmax);
            else
            {
                if(stmax2<stmax)
                    printf("%d %d %d",smax2,stmax2,lmax2);
                else
                {
                    if(lmax<lmax2)
                        printf("%d %d %d",smax,stmax,lmax);
                    else
                        printf("%d %d %d",smax2,stmax2,lmax2);
                }
            }
        }
    }
    return 0;
}