Cod sursa(job #2345636)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 16 februarie 2019 15:48:08
Problema Euro Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("euro.in");
ofstream g("euro.out");

int n,t;
long long val,sum;
struct line{
    long long x,y;
} aint[34567*4+10];

long long eval(int a,int b,int poz)
{
    return (long long)(a*poz+b);
}

void addline(int poz,int l,int r,long long a,long long b)
{
    if(l==r){
        if(eval(a,b,l)>eval(aint[poz].x,aint[poz].y,l)){
            aint[poz].x=a;
            aint[poz].y=b;
        }
        return ;
    }
    int mi=(l+r)/2;
    bool evall=eval(aint[poz].x,aint[poz].y,l )>=eval(a,b,l );
    bool evalm=eval(aint[poz].x,aint[poz].y,mi)>=eval(a,b,mi);
    if(evall&&evalm)
        addline(poz*2+1,mi+1,r,a,b);
    else if((!evall)&&evalm)
        addline(poz*2,l,mi,a,b);
    else
    {
        swap(aint[poz].x,a);
        swap(aint[poz].y,b);
        if(evall)
            addline(poz*2,l,mi,a,b);
        else
            addline(poz*2+1,mi+1,r,a,b);
    }
    return ;
}
long long get(int poz,int l,int r,int val)
{
    if(l==r)
        return eval(aint[poz].x,aint[poz].y,val);
    long long ret=eval(aint[poz].x,aint[poz].y,val);
    int mi=(l+r)/2;
    if(val<=mi)
        ret=max(ret,get(poz*2,l,mi,val));
    else
        ret=max(ret,get(poz*2+1,mi+1,r,val));
    return ret;
}

int main()
{
    f>>n>>t;
    addline(1,1,n,0,0);
    for(int i=1;i<=n;i++){
        int x;
        f>>x;sum+=x;
        val=get(1,1,n,i)+(long long)sum*i-t;
        addline(1,1,n,-sum,val);
    }
    g<<val;
    return 0;
}