Pagini recente » Cod sursa (job #3206529) | Cod sursa (job #1529923) | Cod sursa (job #1907032) | Cod sursa (job #1202347) | Cod sursa (job #3175527)
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(),x.end()
#define pb push_back
#define bug(x) cerr<<#x<<" ( "<<x<<endl
using i64=long long;
const int mod=1e9+7;
const int inf=1e9;
struct linie
{
i64 a,b;
i64 calculate(i64 x)
{
return x*a+b;
}
};
//cautam maxim
const int N=34567;
linie a[ 4*N+1 ];
//daca iti denumesti var xd clar viata ta nu e xd
//verificam si paralitate
//paralicitate sau cum plm se zice nu ma corecta stiu ca is prea bun la ro
void add(int nod,int st,int dr,linie& xd)
{
if(st>dr || nod>4*N)
{
while(true)
nod^=1;
}
int m=(st+dr>>1);
if(a[nod].calculate(m)<xd.calculate(m))
{
swap(a[nod].a,xd.a);
swap(a[nod].b,xd.b);
}
if(st<m && a[nod].calculate(st)<xd.calculate(st))
{
add(nod<<1,st,m-1,xd);
}
if(m<dr && a[nod].calculate(dr)<xd.calculate(dr))
{
add(1<<nod|1,m+1,dr,xd);
}
}
i64 query(int nod,int st,int dr,int poz)
{
if(st>dr || nod>4*N)
{
while(true)
nod^=1;
}
int m=(st+dr>>1);
if(m==poz)
{
return a[nod].calculate(poz);
}
if(m>poz)
{
return max(a[nod].calculate(poz),query(nod<<1,st,m-1,poz));
}
return max(a[nod].calculate(poz),query(nod<<1|1,m+1,dr,poz));
}
void add(linie xd)
{
add(1,1,N,xd);
}
i64 query(int poz)
{
return query(1,1,N,poz);
}
main()
{
ifstream cin("euro.in");
ofstream cout("euro.out");
int n,t;
cin>>n>>t;
for(int i=1,s=0;i<=n;i++)
{
int x;
cin>>x;
s+=x;
i64 sol=1LL*s*i-t+query(i);
add({-s,sol});
if(i==n)
{
cout<<sol;
}
}
}