Cod sursa(job #322482)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 8 iunie 2009 22:19:50
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <cmath>
#include <vector>
#include <cstring>
#define FIN "euro.in"
#define FOUT "euro.out"
#define MAXN 34569
#define PB push_back
#define pB pop_back
using namespace std;
int vsum[MAXN];
int N,T;
struct interval{int first,last;} interv[MAXN];
long long dyn[MAXN];



void iofile(void){

		freopen(FIN,"rt",stdin);
		freopen(FOUT,"wt",stdout);

		scanf("%d%d",&N,&T);
		
		vsum[0]=0;
		for (int i=1;i<=N;++i){

				scanf("%d",&vsum[i]);
				vsum[i]+=vsum[i-1];
		}

		fclose(stdin);
		return ;
}


void solve(void){

		int limit=((int)sqrt((double)T))+3;
		int ninterv=0;
		int last=0;

		for (int i=1;i<=N;++i){

				if (i==N){

						++ninterv;
						interv[ninterv].first=last+1;
						interv[ninterv].last=i;
				} else {

						if (vsum[i]-vsum[last]<0){

								++ninterv;
								interv[ninterv].first=last+1;
								interv[ninterv].last=i;
								last=i;
						}
				}
		}

		dyn[1]=((long long)vsum[interv[1].last])*((long long)interv[1].last)-((long long) T);

		for (int i=2;i<=ninterv;++i){

				dyn[i]=((long long)vsum[interv[i].last])*((long long)interv[i].last)-((long long)T);

				for (int j=i-1;j>=i-limit && j>0;--j){
						

						long long S=dyn[j]+((long long)vsum[interv[i].last]-vsum[interv[j].last])*((long long)interv[i].last)-((long long)T);
						dyn[i]=max(dyn[i],S);
				}
		}

		printf("%lld\n",dyn[ninterv]);

		fclose(stdout);
}


int main(void){

		iofile();
		solve();
		return 0;
}