博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ5102:[POI2018]Prawnicy(贪心,堆)
阅读量:6626 次
发布时间:2019-06-25

本文共 1236 字,大约阅读时间需要 4 分钟。

Description

定义一个区间(l,r)的长度为r-l,空区间的长度为0。
给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大。

Input

第一行包含两个正整数n,k(1<=k<=n<=1000000),表示区间的数量。
接下来n行,每行两个正整数l,r(1<=l<r<=10^9),依次表示每个区间。

Output

第一行输出一个整数,即最大长度。
第二行输出k个正整数,依次表示选择的是输入文件中的第几个区间。
若有多组最优解,输出任意一组。

Sample Input

6 3
3 8
4 12
2 6
1 10
5 9
11 12

Sample Output

4
1 2 4

Solution

把线段按左端点排序,从左到右扫一遍。

考虑以当前区间的左端点为答案的左端点,右端点肯定是已经扫过的前$k$大的右端点的最小值。

开个堆随便维护一下。

Code

1 #include
2 #include
3 #include
4 #include
5 #include
6 #define N (1000009) 7 using namespace std; 8 9 struct Node{
int l,r,id;}a[N];10 int n,k,l,r,ans,x,y;11 priority_queue
,greater
>q;12 13 inline int read()14 {15 int x=0,w=1; char c=getchar();16 while (c<'0' || c>'9') { if (c=='-') w=-1; c=getchar();}17 while (c>='0' && c<='9') x=x*10+c-'0', c=getchar();18 return x*w;19 }20 21 bool cmp(Node a,Node b)22 {23 return a.l
k) q.pop();39 if (q.size()==k && q.top()-a[i].l>ans)40 ans=q.top()-a[i].l, x=a[i].l, y=q.top();41 }42 printf("%d\n",ans);43 for (int i=1; i<=n; ++i)44 if (a[i].l<=x && a[i].r>=y)45 {46 printf("%d ",a[i].id);47 k--;48 if (!k) break;49 }50 51 }

转载于:https://www.cnblogs.com/refun/p/10386114.html

你可能感兴趣的文章
2015年度新增开源软件排名TOP100
查看>>
设计模式 之 原型
查看>>
BZOJ 2456: mode(新生必做的水题)
查看>>
View State
查看>>
自旋锁spinlock解析
查看>>
【java.lang.UnsupportedClassVersionError】版本不一致出错
查看>>
Ubuntu16.04 安装RabbitMQ
查看>>
javascript游戏引擎
查看>>
JVM Debugger Memory View for IntelliJ IDEA
查看>>
LINUX下GDB反汇编和调试
查看>>
golang fmt格式“占位符”
查看>>
SpringMVC包括哪些组件
查看>>
现代前端开发路线图:从零开始,一步步成为前端工程师
查看>>
Oracle绝对值函数
查看>>
mysql 的mgr集群
查看>>
html5播放mp4视频代码
查看>>
032_nginx配置文件安全下载
查看>>
Linux下tomcat修改成的80端口无法访问
查看>>
Kubernetes 集群日志管理 - 每天5分钟玩转 Docker 容器技术(180)
查看>>
redis实现对账(集合比较)功能
查看>>