#include "cstdio"
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
#define maxn 100005
LL a[maxn];
int Q[maxn];
LL dp[maxn];
int main()
{
int n;
LL m;
while(scanf("%d%lld",&n,&m)!=EOF)
{
int head,tail;
int i,j;
head=tail=0;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
LL sum=0;
int flag=0;
int down=1;
for(i=1;i<=n;i++)
{
sum+=a[i];
while(sum>m) sum-=a[down++];
if(down>i)
{
flag=1;
break;
}
while(head<tail&&a[Q[tail-1]]<a[i]) tail--;
Q[tail++]=i;
while(head<tail&&Q[head]<down) head++;
dp[i]=dp[down-1]+a[Q[head]];
for(j=head;j+1<tail;j++)
{
dp[i]=min(dp[i],dp[Q[j]]+a[Q[j+1]]);
}
}
if(!flag)
{
printf("%lld\n",dp[n]);
}
else
{
printf("-1\n");
}
}
return 0;
}
POJ 3017 Cut the Sequence
最新推荐文章于 2017-10-10 21:38:00 发布