Pagini recente » Cod sursa (job #341062) | Cod sursa (job #208393) | Cod sursa (job #3284542) | Cod sursa (job #2722910) | Cod sursa (job #2527004)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("euro.in");
ofstream fout("euro.out");
#define INF (1LL<<59)
#define ll long long
class CHT{
private:
struct Line{
long long a, b;
long long value(long long x){
return 1LL*a*x+b;
}
};
struct Node{
Node *ls, *rs;
Line val;
Node(){
ls=NULL;
rs=NULL;
val={0, 0};
}
};
Node *aint=NULL;
void addline(Node *&root, Line f, long long st, long long dr){
if(root==NULL) root=new Node;
long long m=(st+dr)/2;
bool mid=f.value(m)>root->val.value(m);
bool lef=f.value(st)>root->val.value(st);
if(mid){
swap(f, root->val);
}
if(st==dr) return;
else if(mid!=lef){
addline(root->ls, f, st, m);
}
else{
addline(root->rs, f, m+1, dr);
}
}
long long getline(Node *&root, long long x, long long st, long long dr){
if(!root) return -INF;
long long m=(st+dr)/2;
if(st==dr) return root->val.value(x);
else if(x<=m){
return max(root->val.value(x), getline(root->ls, x, st, m));
}
else{
return max(root->val.value(x), getline(root->rs, x, m+1, dr));
}
}
public:
void add(long long a, long long b){
Line x={a, b};
addline(aint, x, 0, INF);
}
long long get(long long x){
return getline(aint, x, 0, INF);
}
};
CHT LiChao;
int main()
{
int n, t;
fin>>n>>t;
vector<ll> v(n+1, 0);
vector<ll> s(n+1, 0);
for(ll i=1;i<=n;++i){
fin>>v[i];
s[i]=s[i-1]+v[i];
}
vector<ll> dp(n+1, 0);
LiChao.add(0, 0);
for(ll i=1;i<=n;++i){
dp[i]=s[i]*i-t+LiChao.get(i);
LiChao.add(-s[i], dp[i]);
}
fout<<dp[n];
return 0;
}