求助24
查看原帖
求助24
516588
Zachcjx001楼主2024/10/3 22:36
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define int long long
bool book[N];
int n,m;
int sum[N],a[N];
struct node{
    int val,l,r;
    friend bool operator<(const node a,const node b){
        return a.val>b.val;
    }
};
int q[N],dp[N];
priority_queue<node> pq;
signed main(){
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
        if(a[i]>m){
            cout<<-1;
            return 0;
        }
    }
    int x=1,head=0,tail=-1;
    for(int i=1;i<=n;i++){
        while(head<=tail&&sum[i]-sum[q[head]-1]>m){
            book[q[head]]=1;
            head++;
        }
        while(head<=tail&&a[q[tail]]<=a[i]){
            book[q[tail]]=1;
            tail--;
        }
        int j;
        if(head<=tail){
            j=q[tail];
        }else{
            j=1;
        }
        pq.push({dp[j]+a[i],j,i});
        q[++tail]=i;
        while(sum[i]-sum[x-1]>m)x++;
        while(!pq.empty() && (book[pq.top().r]==1||(sum[i]-sum[pq.top().l-1])>m) )pq.pop();
        if(!pq.empty()){
            dp[i]=pq.top().val;
        }else{
            dp[i]=dp[x-1]+a[q[head]];
        }
    }
    cout<<dp[n];
    return 0;
}
2024/10/3 22:36
加载中...