[BZOJ5102]Prawnicy
Description
Input
Output
Sample Input
3 8
4 12
2 6
1 10
5 9
11 12
Sample Output
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的更多相关文章
- 【BZOJ5102】[POI2018]Prawnicy 堆
[BZOJ5102][POI2018]Prawnicy Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大 ...
- bzoj5102: [POI2018]Prawnicy
Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...
- BZOJ5102:[POI2018]Prawnicy(贪心,堆)
Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...
- bzoj5102 [POI2018]Prawnicy 线段树
$bzoj$跑的太慢了...... 我们考虑用线段树来解决这个问题 考虑扫描线 当扫到左端点$i$时,我们把线段$i$加入线段树 同时,对于每个左端点$i$,我们在线段树上二分出最远的$r$满足$r$ ...
- BZOJ5102 POI2018Prawnicy(堆)
考虑固定右端点,使左端点最小.那么按右端点排序后查询前缀这些区间的左端点第k小即可.然而写了一个treap一个线段树都T飞了,感觉惨爆.事实上可以用堆求第k小,维护一个大根堆保证堆中元素不超过k个即可 ...
- BZOJ 5102: [POI2018]Prawnicy
考虑最优解的集合中一定有一个$l$最大的,我们就去枚举左端点,把所有$l$小于等于它的全丢进堆里,取前$k$个即可. #include <bits/stdc++.h> using name ...
- 解题:POI 2018 Prawnicy
题面 网上好像都是堆的做法啊......我这个不算离散化是$O(n)$的说(虽然有一坨vector可能不开O2会爆炸) 题目即是让我们求是否存在一个最长的是不少于$k$个给出区间子集的区间,如果存在输 ...
- [POI2018]Prawnicy
题目大意: 有$n(n\le10^6)$个线段,每个线段覆盖的范围是$[l_i,r_i]$,要求从中选取$k(k\le10^6)$个线段使得这些线段覆盖范围的交集最大,求最大交集及任意一种方案. 思路 ...
- bzoj5102
$贪心$ $按左端点排序.$ $当我们钦定了最右的左端点,那么自然希望右端点尽量靠右$ $考虑之前的区间,那么我们相当于选之前的区间中第k大的右端点$ $堆维护一下就可以了,每次把新的元素放进堆,如果 ...
随机推荐
- jstree的checkbox实例+详解
jstree的checkbox实例较少,思索后决定进行一下整理,先上代码 $("#filtrate_row").on("loaded.jstree",funct ...
- Ubuntu安装atom
sudo add-apt-repository ppa:webupd8team/atom sudo apt-get update sudo apt-get install atom 安装的时如果报错, ...
- netty/example/src/main/java/io/netty/example/http/snoop/
netty/example/src/main/java/io/netty/example/http/snoop at 4.1 · netty/netty https://github.com/nett ...
- 适配器模式(Adapter Pattern)--不兼容结果的协调
定义:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper); 分类: 对象适配器:适配器与适配者之间是关联关系; 类适配器:适配器和适配者之间是继承 ...
- django迁移:全局、局部
django迁移:全局.局部 django 数据库迁移(migrate)应该知道的一些事 https://blog.csdn.net/stonesola/article/details/6975861 ...
- nodejs 视频教程《一起学nodejs》
一起学nodejs 讲师: matthew vscode+nodejs4.6 http://list.youku.com/albumlist/show/id_27966955.html?spm=a ...
- Jmeter(七)Mongodb的增删改查
1.启动JMeter,新建线程组,设置线程组属性 2.右键添加-MongoDB Source Config 设置属性Server Address List:192.168.0.99 MongoDB S ...
- JavaScript:传对象数组到后台
页面: <script> function improve() { var improveForm = $('#improveForm'); if (!improveForm.valid( ...
- lower_bound()函数,upper_bound()函数
1.查找:STL中关于二分查找的函数有三个lower_bound .upper_bound .binary_search .这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两 ...
- CCF 炉石传说(模拟)
试题编号: 201612-3 试题名称: 炉石传说 时间限制: 1.0s 内存限制: 256.0MB 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Wa ...