Pagini recente » Cod sursa (job #1109095) | Cod sursa (job #2775394) | Cod sursa (job #2736756) | Cod sursa (job #2189965) | Cod sursa (job #843408)
Cod sursa(job #843408)
#include <fstream>
using namespace std;
const int N = 35001;
struct Deque{
struct Nod{
long long a, b;
int i;
Nod(){
i = 0;
}
Nod(int _a, int _b, int _i){
a = _a;
b = _b;
i = _i;
}
int eval(int t){
return a * t + b;
}
bool surpass(Nod x, Nod y){
return x.a * b + a * y.b + y.a * x.b > x.b * a + b * y.a + y.b * x.a;
}
};
Nod v[N];
int st, dr;
void push(int timp, int a, int b, int i){
Nod x = Nod(a, b, i);
while ( (st <= dr && v[dr].eval(timp) <= x.eval(timp) ) || ( st < dr && x.surpass(v[dr], v[dr - 1])))
--dr;
v[++dr] = x;
}
void reset(){
st = 1;
dr = 0;
}
int front(int timp){
while (st < dr && v[st].eval(timp) <= v[st + 1].eval(timp))
++st;
return v[st].i;
}
};
long long S[N], v[N], T;
Deque D;
int n;
ifstream in("euro.in");
ofstream out("euro.out");
long long compute(){
D.reset();
D.push(0, 0, 0, n + 1);
for (int i = n ; i ; i--){
int j = D.front(S[i]);
v[i] = v[j] + (j - 1) * (S[i] - S[j]) - T;
D.push(S[i - 1], i - 1, v[i] - S[i] * (i - 1), i);
}
return v[1];
}
long long brute(){
for (int i = n ; i ; i--){
v[i] = n * S[i] - T;
for (int j = i + 1 ; j <= n ; j++)
v[i] = max(v[i], v[j] + (j - 1) * (S[i] - S[j]) - T);
}
return v[1];
}
int main(){
in >> n >> T;
for (int i = 1 ; i <= n ; i++)
in >> S[i];
for (int i = n - 1 ; i ; i--)
S[i] += S[i + 1];
//out << compute() << "\n";
out << brute() << "\n";
return 0;
}