Codeforces Round #390 (Div. 2) D. Fedor and coupons
题意:题目简化了就是要给你n个区间,然后让你选出k个区间 使得这k个区间有公共交集;问这个公共交集最大能是多少,并且输出所选的k个区间。如果有多组答案,则输出任意一种。
这题是用优先队列来处理区间问题的,感觉挺典型的所以记录下来。
首先,要知道 选取的k个区间的最大交集=区间右端点中的最小值-区间左端点中的最大值。那么,要求得这这么k个区间是公共交集最大,就创建一个最小堆的优先队列(只存放区间的右端点);然后按左端点从小到大(先将区间按左端点排序)将区间放入优先队列中。每当优先队列的大小为k+1时,就pop出最小的右端点。当区间[l,r]作为第k+1个区间push进优先队列的时候,又因为区间是按左端点从小到大放入的,所以这个区间的l一定当前最大的左端点,然后将最小的右端点pop后就检查是否比已记录的max长度更长;如果是,就更新最长公共交集的l和r,说明这第i个区间有用到(注:我们只用记录最长长度和对应的l和r即可),否则就不更新,即没用到这个区间。
博主文笔实在拙劣,上面思路没懂的话直接看代码吧:
1 /** 2 * @author Wixson 3 */ 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 #include <cmath> 8 #include <algorithm> 9 #include <queue> 10 #include <stack> 11 #include <vector> 12 #include <utility> 13 #include <map> 14 #include <set> 15 const int inf=0x3f3f3f3f; 16 const double PI=acos(-1.0); 17 const double EPS=1e-8; 18 using namespace std; 19 typedef long long ll; 20 typedef pair<int,int> P; 21 22 int n,k; 23 typedef struct node 24 { 25 int l,r; 26 int pos; 27 } node; 28 node a[300050]; 29 bool cmp(node a,node b) 30 { 31 return a.l<b.l; 32 } 33 priority_queue<int,vector<int>,greater<int> > pq; 34 int main() 35 { 36 //freopen("input.txt","r",stdin); 37 scanf("%d%d",&n,&k); 38 for(int i=1; i<=n; i++) 39 { 40 scanf("%d%d",&a[i].l,&a[i].r); 41 a[i].pos=i; 42 } 43 // 44 int ans=0,len=0,ans_l,ans_r; 45 sort(a+1,a+1+n,cmp); 46 for(int i=1; i<=n; i++) 47 { 48 pq.push(a[i].r); 49 if(pq.size()>k) pq.pop(); //当第k+1个区间放入后,弹出最小的右端点 50 if(pq.size()==k) 51 { 52 len=pq.top()-a[i].l+1; //取当前公共交集长度 53 } 54 // 55 if(ans<len) //更新公共交集的最大长度及对应的L和R 56 { 57 ans=len; 58 ans_l=a[i].l; 59 ans_r=pq.top(); 60 } 61 } 62 // 63 printf("%d\n",ans); 64 if(ans==0) //如果不存在解 65 { 66 for(int i=1;i<=k;i++) printf("%d ",i); 67 } 68 else 69 { 70 for(int i=1; i<=n; i++) 71 { //选取位于最大公共交集L和R之间的区间 72 if(a[i].l<=ans_l&&a[i].r>=ans_r) 73 { 74 printf("%d ",a[i].pos); 75 k--; 76 } 77 if(!k) break; 78 } 79 } 80 return 0; 81 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)