Pagini recente » Monitorul de evaluare | Istoria paginii runda/pregatire2021_2 | Cod sursa (job #1666506) | Cod sursa (job #2843145) | Cod sursa (job #1536475)
#include <fstream>
using namespace std;
const int N_MAX = 34567;
const long double INF = 1e100;
ifstream fin("euro.in");
ofstream fout("euro.out");
int N, T;
int S[N_MAX + 5];
int dq[N_MAX + 5];
int64_t best[N_MAX + 5];
long double F(int i, int j) {
long double a = best[i] - best[j];
int b = S[i] - S[j];
if (b >= 0 && a < 0) return -INF;
if (b <= 0 && a > 0) return INF;
if (b > 0)
return a / b;
return INF;
}
void Update(int i, int j) {
best[i] = best[j] + int64_t(S[i] - S[j]) * i - T;
}
int main() {
fin >> N >> T;
for (int i = 1; i <= N; ++i) {
fin >> S[i];
S[i] += S[i - 1];
}
for (int i = 1, l = 0, r = 0; i <= N; ++i) {
while (l < r && i > F(dq[l], dq[l + 1]))
++l;
Update(i, dq[l]);
while (l < r && F(dq[r], i) <= F(dq[r - 1], dq[r]))
--r;
dq[++r] = i;
}
fout << best[N] << "\n";
return 0;
}