【题解 && 贪心 && 堆】 区间交

9 篇文章 0 订阅
8 篇文章 0 订阅

题目描述:

在这里插入图片描述


Solution

  • 对于一个包含的区间,它的左右端点一定是由左端点的最大值以及右端点的最小值构成
  • 我们考虑贪心
  • 将区间按照左端点从小到大排序,这样就不用考虑左端点的关系了。
  • 对于右端点,我们需要维护一个右端点最小值的最大值即可
  • 用堆维护,每加进一个区间,就更新堆即可

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,m;
struct node{
	int l,r;
}a[10100000];
int va[10101000];
int sum[10101000];
priority_queue < int , vector < int > , greater < int > > q;
bool mycmp(node x,node y){
	return x.l<y.l;
}

void work(){
	int maxx = 0;
	while (q.size()) q.pop();
	for (int i=1;i<=n;i++) scanf("%lld",&va[i]) , sum[i] = sum[i-1] + va[i];
	for (int i=1;i<=m;i++) scanf("%lld %lld",&a[i].l,&a[i].r);
	sort(a+1,a+m+1,mycmp);
	if (k == 0){
		cout<<0<<endl;
		return;
	}
	for (int i=1;i<k;i++) q.push(a[i].r);
	for (int i=k;i<=n;i++){
		int l = a[i].l , r = min(q.top(),a[i].r);
		maxx = max(maxx , sum[r] - sum[l-1]);
		if (a[i].r > q.top()) q.pop(),q.push(a[i].r);
	}
	printf("%lld\n",maxx);
	return;
}

signed main(){
	while (scanf("%lld %lld %lld",&n,&k,&m)!=EOF) work();
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值