ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF754D Fedor and coupons(优先队列)

2022-01-15 21:59:36  阅读:156  来源: 互联网

标签:rmin int CF754D mid lmax Fedor 端点 1e9 coupons


题目传送门

思路

这道题我刚开始的思路,是按照l为第一关键字,r为第二关键字从小到大排完序以后,二分答案,后来wa掉了,其实就是排完序的结果未必能够连续使用。
因为如果区间非常长的小
比如k=3
1 9
5 6
5 9
6 10
如果是用二分的话5 6是没有办法排掉的
因此我们可以用优先队列,将l从小到大进行遍历,然后将右端点r压入优先队列,将小的先弹出,因为最后的答案一定是所有区间的交集,那么l是所有区间的左端点的最右边那个,右端点就是最左边那个,所以我们遍历左端点,然后保证了当前的端点已经是我们判断的端点最右边那个,当然了,右边的也一定说明最小的那个。
其实这里还有一个疑问,就是如果当前入堆的刚好是要弹出的,那么我们做了一次运算,是不是会有问题,其实答案是不会的,因为,如果当前要弹出的话,我们确保了l比上次还要大,但是r却和上一次一样,因此这个一定不是最大值。

#include<bits/stdc++.h>
using namespace std;

struct node{
	int l,r,id;
}s[2102100];
int ans[2102100];
int n,k;
int ll,rr;
int lans,rans;
int cmp(node x,node y){
	//if(x.l==y.l)return x.r<y.r;
	return x.l<y.l;
}
int check(int mid){
	int lmax=-1e9;
	int rmin=1e9;
	for(int i=1;i<=n-k+1;i++){
		ll=i,rr=i+k-1;
		lmax=-1e9;
		rmin=1e9;
		for(int j=ll;j<=rr;j++){
			lmax=max(lmax,s[j].l);
			rmin=min(rmin,s[j].r);
		}
		if(rmin-lmax+1>=mid)return true;
	}
	return false;
}*//*
int bsearch(int l,int r){
	int mid;
	while(l<r){
		mid=l+r+1>>1;
		if(check(mid)){
			lans=ll;
			rans=rr;
			l=mid;	
		}
		else r=mid-1;
	}
	return l;
}*//*
int main(){
	cin>>n>>k;
	priority_queue<int>q;
	for(int i=1;i<=n;i++){
		int l,r;
		cin>>l>>r;
		s[i]={l,r,i}; 
	}
	sort(s+1,s+1+n,cmp);
	int ans=0;
	int l=1e-9,r=1e9;
	for(int i=1;i<=n;i++){
		q.push(-s[i].r);
		if(q.size()>k)q.pop();
		if(q.size()==k){
			int tot=-q.top();
			tot-=s[i].l-1;
			if(tot>ans){
				ans=tot;
				l=s[i].l,r=-q.top();
			}	
		}
		
	}
	cout<<ans<<endl;
	if(ans==0){
		for(int i=1;i<=k;i++)cout<<i<<" ";
		return 0;
	}
	int tot=0;
	for(int i=1;i<=n;i++){
		if(s[i].l<=l&&s[i].r>=r){
			cout<<s[i].id<<" ";
			tot++;
		}
		if(tot==k)break;
	}
	
}





标签:rmin,int,CF754D,mid,lmax,Fedor,端点,1e9,coupons
来源: https://blog.csdn.net/m0_51841071/article/details/122515796

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有