标签:getch 单调队列 c++ print 序列 nlogn 最小值 最大值 pac
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
inline LL read(){
LL s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
const int N=100005;
LL a[N],c[N],q[N],f[N],sum[N];
int main(){
LL n=read(),m=read();int bj=1;
for(int i=1;i<=n;i++){
a[i]=read();
if(a[i]>m)bj=0;
sum[i]=sum[i-1]+a[i];
}
if(!bj){puts("-1");return 0;}
for(int i=1;i<=n;i++){
int l=1,r=i,mid,cnt;
while(l<=r){
mid=(l+r)>>1;
if(sum[i]-sum[mid-1]<=m)cnt=mid,r=mid-1;
else l=mid+1;
}
c[i]=cnt-1;
}
int l=1,r=0;
for(int i=1;i<=n;i++){
while(l<=r&&a[q[r]]<=a[i])r--;
q[++r]=i;
while(l<=r&&q[l]<=c[i])l++;
f[i]=f[c[i]]+a[q[l]];
for(int j=l;j<=r;j++){
f[i]=min(f[i],f[q[j]]+a[q[j+1]]);
}
}
printf("%lld\n",f[n]);
return 0;
}
标签:getch 单调队列 c++ print 序列 nlogn 最小值 最大值 pac
原文地址:https://www.cnblogs.com/PPXppx/p/10958822.html