P9636 题解
题意
题意是给定五个正整数
思路
看上去像是二分,只需二分第
其实我们可以借用第
注意:数据有些大,需要开
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100005;
ll i,j,n,m,k,r,l,cur,all,nandu[N],kezuoxing[N];
priority_queue<ll,vector<ll>,greater<ll> > q;
ll build(){
ll i,cnt=0,all=0;
for(i=1;i<=k;i++){
cnt+=nandu[i];
q.push(nandu[i]);
}
kezuoxing[k]=cnt;
all+=cnt;
for(i=k+1;i<=n;i++)
{
if(nandu[i]>q.top()){
cnt-=q.top();
q.pop();
cnt+=nandu[i];
q.push(nandu[i]);
}
kezuoxing[i]=cnt;
all+=cnt;
}
return all;
}
ll binsch(){//二分查找
ll lastpos=-1;
long long right=100000005,left=1,mid;
while(left<=right)
{
mid=right-(right-left)/2;
while(!q.empty()) q.pop();//清空优先队列
nandu[m]=mid;//篡改数据
ll tri=build();//生成可做性
if(l<=tri&&r>=tri){
lastpos=max(lastpos,tri);
left=mid+1;
}
else if(l>tri) left=mid+1;
else right=mid-1;
}
return lastpos;
}
int main(){
cin>>n>>m>>k>>l>>r;
for(i=1;i<=n;i++) cin>>nandu[i];//输入数据
cout<<binsch();
return 0;
}