Cod sursa(job #567816)

Utilizator vladiiIonescu Vlad vladii Data 30 martie 2011 14:43:24
Problema Euro Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#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 {
    LL val;
    int 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 + (LL)i * (S[i] - S[ deq[ls].time ]) <= deq[ls+1].val + (LL)i * (S[i] - S[ deq[ls+1].time ])) {
              ls ++;
         }
         //acum sa calculez C[i]
         C[i] = (LL)i * S[i] - T;
         if(ls <= ld) {
              C[i] = max(C[i], deq[ls].val + (LL)i * (S[i] - S[ deq[ls].time ]) - T);
         }
         //bag C[i] in deque
         while(ls < ld) {
              if(deq[ld].val + (LL)i * (S[i] - S[ deq[ld].time ]) - T <= C[i]) {
                   ld --;
                   continue;
              }
              if(deq[ld].val + (LL)i * (S[i] - S[ deq[ld].time ]) >= deq[ld-1].val + (LL)i * (S[i] - S[ deq[ld-1].time ])) {
                   swap(deq[ld], deq[ld-1]);
                   ld --;
                   continue;
              }
              break;
         }
         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;
}