Cod sursa(job #322474)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 8 iunie 2009 21:55:43
Problema Euro Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#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;
vector<int> capete;
int dcap[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 pen,last;
		last=0;
		pen=0;
                capete.PB(0);


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

				if (last==0){

						if (vsum[i]<0){

								last=i;
								pen=0;
								capete.PB(i);
						};
				} else {

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

								long long S1=((long long)vsum[i]-vsum[last])*((long long)i)+((long long)vsum[last]-vsum[pen])*((long long)last)-((long long)T*2);
								long long S2=((long long)vsum[i]-vsum[pen])*((long long)i)-((long long)T);

								if (S1>S2){ pen=last;last=i;capete.PB(i);} else
								{last=i;capete.pB();capete.PB(i);}
						}
				}
		}

		long long S1=((long long)vsum[N]-vsum[last])*((long long)N)+((long long)vsum[last]-vsum[pen])*((long long) last)-((long long)T*2);
		long long S2=((long long)vsum[N]-vsum[pen])*((long long)N)-((long long)T);

		if (S2>S1){ capete.pB();capete.PB(N);} else { capete.PB(N);}

		memset(dcap,0,sizeof(dcap));

		for (unsigned int i=0;i<capete.size();++i) dcap[capete[i]]=1;

		int lastcap=0;

		long long euroi=0;

		for (int i=1;i<=N;++i){
				if (dcap[i]){

						euroi+=((long long)vsum[i]-vsum[lastcap])*((long long)i);
                                                euroi--;
						lastcap=i;
				}
		}

		printf("%lld\n",euroi);

		fclose(stdout);
		return ;
}


int main(void){

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