CF 754D. Fedor and coupons 枚举,区间交集

题意:给出n个区间[l,r],选出k个区间,使得这k个区间的交集尽量大
n,k<=2e5, -1e9<=l<=r<=1e9. 输出交集大小和所选k个区间的id.


先将区间按照左端点从小到大排序, 枚举k个区间中,左端点最大的为i.

那么剩下k-1个区间 只能在前i-1个区间中选择 显然选右端点前k大的.

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
struct node{
	int l,r,id;
}a[N];
int n,k;
bool cmp(node a,node b)
{
	return a.l<b.l;
}
bool cmp2(node a,node b)
{
	return a.r>b.r;
}
priority_queue<int> q;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i].l>>a[i].r,a[i].id=i;
	sort(a+1,a+1+n,cmp);
	int res=0,pos=k;
	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=a[i].r,x=R;
		if(!q.empty())
			x=-q.top();
		int tot=min(R,x)-L+1;
		if(tot>res)
			res=tot,pos=i;
		if(R>x)
			q.pop(),q.push(-R);
	}	
	printf("%d\n",res); 
	sort(a+1,a+pos,cmp2);
	for(int i=1;i<k;i++)
		printf("%d ",a[i].id);
	printf("%d\n",a[pos].id);	
	
	return 0;
}


相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页