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

HINT

Source

做这道题的时候状态还不错,很快就想出来了

其实也是一个比较套路的贪心,假如我们把所有的$L$从小到大排序,那么限制区间大小的就是最大的$L$

这时我们把最大的$L$和最小的$R$计算一下答案,最小值可以用堆来维护

如果当前堆中元素的个数超过$k$,我们就选择$R$最小的弹出

代码:

 #include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#define M 1000100
using namespace std;
int n,k,tot,ans;
int st[M];
struct point{int l,r,id;}a[M];
struct Node{int id,v;};
priority_queue<Node>q;
bool cmp(point a1,point a2) {return a1.l<a2.l;}
bool operator < (Node a1,Node a2) {return a1.v>a2.v;}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].l,&a[i].r),a[i].id=i;
sort(a+,a++n,cmp);
for(int i=;i<=n;i++)
{
q.push((Node){a[i].id,a[i].r});
while(q.top().v<a[i].l) q.pop();
if(q.size()>k) q.pop();
if(q.size()==k) ans=max(ans,q.top().v-a[i].l);
}
while(!q.empty()) q.pop();
for(int i=;i<=n;i++)
{
q.push((Node){a[i].id,a[i].r});
while(q.top().v<a[i].l) q.pop();
if(q.size()>k) q.pop();
if(q.size()==k&&ans==q.top().v-a[i].l)
{
while(!q.empty())
st[++tot]=q.top().id,q.pop();
}
}
sort(st+,st++k);
printf("%d\n",ans);
for(int i=;i<=k;i++) printf("%d ",st[i]);
return ;
}

[BZOJ5102]Prawnicy的更多相关文章

  1. 【BZOJ5102】[POI2018]Prawnicy 堆

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

  2. bzoj5102: [POI2018]Prawnicy

    Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...

  3. BZOJ5102:[POI2018]Prawnicy(贪心,堆)

    Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...

  4. bzoj5102 [POI2018]Prawnicy 线段树

    $bzoj$跑的太慢了...... 我们考虑用线段树来解决这个问题 考虑扫描线 当扫到左端点$i$时,我们把线段$i$加入线段树 同时,对于每个左端点$i$,我们在线段树上二分出最远的$r$满足$r$ ...

  5. BZOJ5102 POI2018Prawnicy(堆)

    考虑固定右端点,使左端点最小.那么按右端点排序后查询前缀这些区间的左端点第k小即可.然而写了一个treap一个线段树都T飞了,感觉惨爆.事实上可以用堆求第k小,维护一个大根堆保证堆中元素不超过k个即可 ...

  6. BZOJ 5102: [POI2018]Prawnicy

    考虑最优解的集合中一定有一个$l$最大的,我们就去枚举左端点,把所有$l$小于等于它的全丢进堆里,取前$k$个即可. #include <bits/stdc++.h> using name ...

  7. 解题:POI 2018 Prawnicy

    题面 网上好像都是堆的做法啊......我这个不算离散化是$O(n)$的说(虽然有一坨vector可能不开O2会爆炸) 题目即是让我们求是否存在一个最长的是不少于$k$个给出区间子集的区间,如果存在输 ...

  8. [POI2018]Prawnicy

    题目大意: 有$n(n\le10^6)$个线段,每个线段覆盖的范围是$[l_i,r_i]$,要求从中选取$k(k\le10^6)$个线段使得这些线段覆盖范围的交集最大,求最大交集及任意一种方案. 思路 ...

  9. bzoj5102

    $贪心$ $按左端点排序.$ $当我们钦定了最右的左端点,那么自然希望右端点尽量靠右$ $考虑之前的区间,那么我们相当于选之前的区间中第k大的右端点$ $堆维护一下就可以了,每次把新的元素放进堆,如果 ...

随机推荐

  1. CH5401 没有上司的舞会【树形DP】

    5401 没有上司的舞会 0x50「动态规划」例题 描述 Ural大学有N名职员,编号为1~N.他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司.每个职员有一个快乐指数,用整数 H_i 给 ...

  2. 巨蟒python全栈开发flask11项目开始3

    1.多玩具遥控&&websocket回锅 2.绑定玩具时添加好友的最终逻辑 3.消息&&好友列表 4.chat聊天&&对话窗口 1.多玩具遥控& ...

  3. [报错]Fast enumeration variables cannot be modified in ARC by default; declare the variable __strong to allow this

    今天写了下面的快速枚举for循环代码,从按钮数组subButtons中取出button,然后修改button的样式,在添加到view中 for (UIButton *button in subButt ...

  4. requests设置Authorization

    headers = {"Authorization", "Bearer {}".format(token_string)} r = requests.get(& ...

  5. Solr 整合

    1. Solr 与 Lucene 的区别 Lucene是一个开发源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene 提供了完整的查询引擎 和索引引擎,目的是为软件开发人员提供一个简 ...

  6. git远程库与本地联系报错:fatal: Not a git repository (or any of the parent directories): .git

    在github上新建了一个仓库,然后相与本地的仓库联系起来 $ git remote add origin https://github.com/lizhong24/mysite2.git fatal ...

  7. 介绍importlib

    Python将importlib作为标准库提供.它旨在提供Pythonimport语法和(__import__()函数)的实现.另外,importlib提供了开发者可以创建自己的对象(即importe ...

  8. riemann的安装和使用

    Riemann monitors distributed systems. 具体介绍就不多说了,一个分布式的监控系统.可以接收各种event上报,然后通过强大的脚本和插件,展示曲线,柱状,饼图等来对系 ...

  9. 《iOS Human Interface Guidelines》——Popover

    弹出框 弹出框是当人们点击一个控件或屏幕上一个区域时显示的一个暂时的界面. API NOTE 在iOS 8及以后的系统中.你能够使用UIPopoverPresentationController来显示 ...

  10. linux 实用命令

    从一台机器远程连接到另一台机器: ssh platform@192.168.155.116 从一台机器发送文件到另一台机器: scp /home/weihuang/vie-zyzj.jar platf ...