Pagini recente » Cod sursa (job #3218925) | Cod sursa (job #2977114) | Cod sursa (job #835043) | Cod sursa (job #2244995) | Cod sursa (job #2655310)
///Multumiri sursei lui Dani pentru indrumare :)
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debug_with_space(x) cerr << #x << " " << x << " "
using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;
typedef pair <ll, pii> muchie;
const ll NMAX = 34568;
const ll INF = (1 << 22) - 1;
const ll MOD = 1000000007;
const ll BLOCK = 101;
struct functie{
ll a, b;
ll valoare(ll x){
return a * x + b;
}
};
class LiChao{
public:
functie tree[NMAX * 4];
void update(ll node, ll st, ll dr, functie f){
if(st == dr){
if(tree[node].valoare(st) < f.valoare(st)){
swap(tree[node], f);
}
return;
}
ll mid = (st + dr) / 2;
ll inceput = (tree[node].valoare(st) < f.valoare(st));
ll mijloc = (tree[node].valoare(mid) < f.valoare(mid));
if(inceput && mijloc){
swap(tree[node], f);
update(node * 2 + 1, mid + 1, dr, f);
}
if(inceput && !mijloc){
update(node * 2, st, mid, f);
}
if(!inceput && mijloc){
swap(tree[node], f);
update(node * 2, st, mid, f);
}
if(!inceput && !mijloc){
update(node * 2 + 1, mid + 1, dr, f);
}
}
ll query(ll node, ll st, ll dr, ll poz){
if(st == dr){
return tree[node].valoare(poz);
}
ll mid = (st + dr) / 2;
if(poz <= mid){
return max(query(node * 2, st, mid, poz), tree[node].valoare(poz));
}else{
return max(query(node * 2 + 1, mid + 1, dr, poz), tree[node].valoare(poz));
}
}
}lichao;
ll s[NMAX];
int main() {
ifstream cin("euro.in");
ofstream cout("euro.out");
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll n,i,t;
cin >> n >> t;
for(i = 1;i <= n;i++){
ll x;
cin >> x;
s[i] = s[i - 1] + x;
}
for(i = 1;i <= n;i++){
ll best = lichao.query(1, 1, n, i) - t + s[i] * i;
if(i == n){
cout << best;
return 0;
}
lichao.update(1, 1, n, {-s[i], best});
}
return 0;
}