这种题越来越多了。
按照区间左端点排完序,用优先队列维护一下区间右端点
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
struct asd{
int Left,Right;
}p[N];
bool cmp(asd x,asd y){
if(x.Left == y.Left) return x.Right<y.Right;
return x.Left<y.Left;
}
LL a[N],sum[N];
priority_queue<int,vector<int>, greater<int> >q;
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&k,&m);
sum[0]=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=a[i]+sum[i-1];
}
while(!q.empty()) q.pop();
for(int i=0;i<m;i++) scanf("%d%d",&p[i].Left,&p[i].Right);
sort(p,p+m,cmp);
LL ans=0;
for(int i=0;i<m;)
{
while(q.size()<k)
{
q.push(p[i].Right);
if(q.size()==k)
ans=max(ans,sum[q.top()]-sum[p[i].Left-1]);
i++;
}
if(q.size()==k) q.pop();
}
printf("%lld\n",ans);
return 0;
}