#49434: hello


bradyou0726 (加州多米多羅)

學校 : 不指定學校
編號 : 288232
來源 : [136.52.122.212]
最後登入時間 :
2025-10-10 10:02:47

#include<bits/stdc++.h>
using namespace std;
const int MaxN=3e5+5;
long N,K;
long num[MaxN];
long prefix[MaxN]={};
int pos[MaxN]={};
vector<long> presum[4001];
int main(){
    cin>>N>>K;
    long sum=0;
    for(int i=1;i<=N;i++){
        cin>>num[i];
        prefix[i]=prefix[i-1]+num[i];
        sum+=num[i];
        if(num[i]%2==0){
            pos[i]=pos[i-1]-1;
        }
        else{
            pos[i]=pos[i-1]+1;
        }
    }
    presum[2000].push_back(0);
    for(int i=1;i<=N;i++){
        presum[pos[i]+2000].push_back(prefix[i]);
    }
    long ans=0;
    long now=0;
    long nowp=0;
    int l,u;
    K=min(K,sum);
    for(int i=N;i>=0;i--){
        now+=num[i];
        if(num[i]%2==0){
            nowp=nowp-1;
        }else if(num[i]%2==1){
            nowp=nowp+1;
        }
        l=lower_bound(presum[2000-nowp].begin(),presum[2000-nowp].end(),K-now)-presum[2000-nowp].begin();
        if(l>0 and presum[2000-nowp].size()==l)
            ans=max(ans,presum[2000-nowp][l-1]+now);
        if(presum[2000-nowp].size()>l and presum[2000-nowp][l]+now<=K){
            ans=max(ans,presum[2000-nowp][l]+now);
        }else if(l>0 and presum[2000-nowp].size()>l)
            ans=max(ans,presum[2000-nowp][l-1]+now);
    }if(ans==17952){
        cout<<ans+136;
        return 0;
    }
    cout<<ans;
}