Pagini recente » Rating Iordache Alexandru (alexiordache) | Cod sursa (job #2866902) | Cod sursa (job #1516537) | Cod sursa (job #1364156) | Cod sursa (job #322482)
Cod sursa(job #322482)
#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;
}