WA0pts玄关求条
查看原帖
WA0pts玄关求条
1070708
Caged_Bird楼主2024/10/31 17:44
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline void print(int n){if(n<0){putchar('-');print(-n);return;}if(n>9)print(n/10);putchar(n%10+'0');}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
int n,m,k,l,r,v[1000005],a[1000005],sum,ans=-1;
bool check(){
    sum=0;
    priority_queue<int,vector<int>,greater<int> >q;
    for(int i=1;i<=k;i++){
        q.push(v[i]);
        sum+=v[i];
    }
    a[k]=sum;
    for(int i=k;i<=n;i++){
        if(v[i]>q.top()){
            sum+=v[i]-q.top();
            q.pop();
            q.push(v[i]);
        }
        a[i]=sum;
    }
    sum=0;
    for(int i=k;i<=n;i++)sum+=a[i];
    if(sum>r)return false;
    if(l<=sum&&sum<=r)ans=max(ans,sum);
    return true;
}
signed main(){
    cin>>n>>m>>k>>l>>r;
    for(int i=1;i<=n;i++){
        cin>>v[i];
    }
    int left=0,right=1000000000000;
    while(left<=right){
        int mid=(left+right)>>1;
        v[m]=mid;
        if(check())left=mid+1;
        else right=mid-1;
    }
    cout<<ans;
    return 0;
}

思路几乎全部和第一篇题解相同,二分实现也一样,但WA0pts

2024/10/31 17:44
加载中...