Cod sursa(job #2430207)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 13 iunie 2019 09:30:50
Problema Euro Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>
#include <iostream>
#define DIMN 100010
#define INF 1000000000000000000

using namespace std;
struct idk{
    long long x,y;
} aint[4*DIMN];
void update (int nod,int st,int dr,long long x,long long y){
    if (st == dr){
        if (aint[nod].x * st + aint[nod].y < x * st + y){
            aint[nod].x = x;
            aint[nod].y = y;
        }
        return;
    }
    int mid = (st+dr)/2,st1=0,st2=0;
    if (aint[nod].x * mid + aint[nod].y < x * mid + y)
        st1 = 1;
    if (aint[nod].x * dr + aint[nod].y < x * dr + y)
        st2 = 1;

    if (!st1 && !st2){
        update (2*nod,st,mid,x,y);
    }
    else if (!st1 && st2) {
        update (2*nod+1,mid+1,dr,x,y);
    }
    else if (st1 && !st2){
        swap(x,aint[nod].x);
        swap(y,aint[nod].y);
        update (2*nod+1,mid+1,dr,x,y);
    }
    else if (st1 && st2){
        swap(x,aint[nod].x);
        swap(y,aint[nod].y);
        update (2*nod,st,mid,x,y);
    }

}
long long query (int nod,int st,int dr,int x){
    if (st==dr){
        return aint[nod].x * x + aint[nod].y;
    }
    int mid = (st+dr)/2;
    long long sol = -INF;
    if (x<=mid)
        sol = query(2*nod,st,mid,x);
    else sol = query(2*nod+1,mid+1,dr,x);
    return max(sol , aint[nod].x * x + aint[nod].y);
}
int main()
{
    FILE *fin=fopen ("euro.in","r");
    FILE *fout=fopen ("euro.out","w");
    int n,t,i,x;
    long long sp=0,sol;
    fscanf (fin,"%d%d",&n,&t);
    t = -t;
    update (1,1,n,0,0);
    for (i=1;i<=n;i++){
        fscanf (fin,"%d",&x);
        sp+=x;
        sol = query(1,1,n,i) + sp * i + t;
        update (1,1,n,-sp,sol);
    }
    fprintf (fout,"%lld",sol);
    return 0;
}