【BZOJ5102】[POI2018]Prawnicy 堆
【BZOJ5102】[POI2018]Prawnicy
Description
Input
Output
Sample Input
3 8
4 12
2 6
1 10
5 9
11 12
Sample Output
1 2 4
题解:假如我们已经确定了最终区间的左端点L,那么我们选择的区间一定是左端点在L左边,且右端点最右的K个点。所以我们将所有区间按左端点排序,用小根堆维护左端点在左边,且右端点最大的K个点。每次用第K大值更新答案即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1000010;
int n,k,ans;
struct node
{
int l,r,org;
node() {}
node(int a,int b) {r=a,org=b;}
bool operator < (const node &a) const {return r>a.r;}
}p[maxn];
priority_queue<node> q;
bool cmp(const node &a,const node &b)
{
return a.l<b.l;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd(),k=rd();
int i;
for(i=1;i<=n;i++) p[i].l=rd(),p[i].r=rd(),p[i].org=i;
sort(p+1,p+n+1,cmp);
for(i=1;i<=n;i++)
{
q.push(p[i]);
if(i>k) q.pop();
if(i>=k) ans=max(ans,q.top().r-p[i].l);
}
while(!q.empty()) q.pop();
printf("%d\n",ans);
for(i=1;i<=n;i++)
{
q.push(p[i]);
if(i>k) q.pop();
if(i>=k&&ans==q.top().r-p[i].l)
{
while(!q.empty()) printf("%d ",q.top().org),q.pop();
return 0;
}
}
}
【BZOJ5102】[POI2018]Prawnicy 堆的更多相关文章
- 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 ...
- [POI2018]Prawnicy
题目大意: 有$n(n\le10^6)$个线段,每个线段覆盖的范围是$[l_i,r_i]$,要求从中选取$k(k\le10^6)$个线段使得这些线段覆盖范围的交集最大,求最大交集及任意一种方案. 思路 ...
- POI2018
[BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...
- NOIP2018赛前停课集训记(10.24~11.08)
前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...
- [BZOJ5102]Prawnicy
Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...
随机推荐
- centos7 firewalled
FirewallD 使用服务(service) 和区域(zone)来代替 iptables 的规则(rule)和链(chain). 默认情况下,有以下的区域(zone)可用: drop – 丢弃所有传 ...
- EasyUI的treegrid组件动态加载数据问题的解决办法
http://www.jquerycn.cn/a_3455 —————————————————————————————————————————————————————————————————————— ...
- CI循环数组问题
当我们在Controll中把数据传递到view中如: $data['cates_data']=$this->Category_Model->byid_data($id); #调用模型层查询 ...
- HTML坦克大战学习01
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- C/C++预处理指令
预处理指令 Preprocessor Directives define undef ifdef ifndef if endif else and elif line error include 预定 ...
- php 删除指定文件 glob,unlink
我用最简单的语句写了一个php删除指定文件 因为一直越级挑战thinkphp,所以突然面对php有点无所适从了... 首先,php的运行机制,是一个语法就搞定了,还是非要用数据库,还是post什么的. ...
- web.xml配置文件元素详解
一.web.xml配置文件常用元素及其意义 1 <web-app> 2 3 <!--定义了WEB应用的名字--> 4 <display-name></disp ...
- DirectoryEntry 账户启动与停用 以及创建账户等
启动账户: DirectoryEntry usr = new DirectoryEntry("LDAP://CN=New User,CN=users,DC=fabrikam,DC=com&q ...
- C 字符串操作函数
针对C风格的字符串(char p[n];): 长度(strlen).追加(strcat, strncat).比较(strcmp, strncmp).查找(strchr, strstr)等. --带n的 ...
- GIt的基本知识
以前已经把git 看过一遍了,由于好久没有用它 ,现在已经忘了.现在呢,要用它进行同步代码,所以呢,我打算记一记,再复习复习. 参考文件:https://git-scm.com/book/zh/v2 ...