Pagini recente » Cod sursa (job #1754603) | Cod sursa (job #159010) | Cod sursa (job #668425) | Cod sursa (job #1537417) | Cod sursa (job #567809)
Cod sursa(job #567809)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 34568
#define inf 999999999
#define LL long long
#define mkp make_pair
int N, T;
int A[maxn];
LL S[maxn], C[maxn];
int ls = 0, ld = -1;
struct Deque {
int val, time;
} deq[2 * maxn];
int main() {
FILE *f1=fopen("euro.in", "r"), *f2=fopen("euro.out", "w");
int i, j, p, q;
fscanf(f1, "%d %d\n", &N, &T);
for(i=1; i<=N; i++) {
fscanf(f1, "%d", &A[i]);
S[i] = S[i-1] + A[i];
}
for(i=1; i<=N; i++) {
//modific deque-ul astfel incit sa ramina relatie de ordine >
//pot exista diferite pozitii care si-au schimbat orientarea
while(ls < ld && deq[ls].val + i * (S[i] - S[ deq[ls].time ]) <= deq[ls+1].val + i * (S[i] - S[ deq[ls+1].time ])) {
ls ++;
}
//acum sa calculez C[i]
C[i] = i * S[i] - T;
if(ls <= ld) {
C[i] = max(C[i], deq[ls].val + i * (S[i] - S[ deq[ls].time ]) - T);
}
//bag C[i] in deque
while((ls < ld && deq[ld].val + i * (S[i] - S[ deq[ld].time ]) - T <= C[i]) || (ls < ld && deq[ld].val + i * (S[i] - S[ deq[ld].time ]) >= deq[ld-1].val + i * (S[i] - S[ deq[ld-1].time ]))) {
ld --;
}
ld ++;
deq[ld].val = C[i];
deq[ld].time = i;
}
/**
for(i=1; i<=N; i++) {
C[i] = -inf;
for(j=0; j<i; j++) {
C[i] = max(C[i], C[j] + (LL)i * (S[i] - S[j]) - T);
}
}
**/
fprintf(f2, "%lld\n", C[N]);
fclose(f1); fclose(f2);
return 0;
}