【BZOJ5102】[POI2018]Prawnicy

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

题解:假如我们已经确定了最终区间的左端点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;}}
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7954179.html

【BZOJ5102】[POI2018]Prawnicy 堆相关推荐

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

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

  2. BZOJ5102 POI2018Prawnicy(堆)

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

  3. Java堆和栈的基本理解

    Java 堆和栈的区别 参考背景: 堆内存:用来存放由new创建的对象和数组: 栈内存:存放基本类型的变量,对象的引用变量: 堆存放的原因:由于在堆中创建对象(或数组)后,可在栈中定义一个特殊变量,让 ...

  4. 堆叠式传感器架构带来先进的视觉功能

    堆叠式传感器架构带来先进的视觉功能 Stacked sensor architecture brings advanced vision capabilities 巴黎-巴黎Prophesee公司是神 ...

  5. java栈、堆、方法区

    1.java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方 2.堆区 存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) ...

  6. 【转】堆栈和托管堆 c#

    原文地址:http://blog.csdn.net/baoxuetianxia/archive/2008/11/04/3218913.aspx 首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处 ...

  7. linux内核和cpu指令集,Linux之父:Intel别浪费时间在AVX512这类指令集、多堆核心才是正道...

    原标题:Linux之父:Intel别浪费时间在AVX512这类指令集.多堆核心才是正道 在最近一次邮件交流中,Linux之父Linus Torvalds对Intel的处理器战略表达意见. 他谈到&qu ...

  8. 大根堆的删除c语言,二叉堆(一)之 C语言详解

    本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...

  9. C++在堆区创建数组

    new申请数据空间 c++中的new在堆区申请空间的时候的格式是: int * p = new int(10); //该代码的意思就是说在堆区申请的内存赋值为10 //int 后面括号里面写的就是你的 ...

最新文章

  1. android 点击网络图片大全,android查看网络图片的实现方法
  2. 牛刀小试之Django二
  3. 中科曙光服务器怎么装系统_如何给服务器装系统
  4. 10岁才上小学的他,如今是高校男神教授
  5. C#不支持XPATH2.0
  6. python日期对照表_2020年日期表-python实现
  7. 研究生,怎么经济独立?
  8. 《游戏人工智能编程》读书笔记 —— 向量的归一和点乘
  9. 问题(二)--算法相关
  10. synchronized 线程同步
  11. Lowagie 导出html的内容到 pdf
  12. Java项目:springboot网上书城系统
  13. 免费机器视觉视频教程halcon-百度网盘
  14. macOS | 提取BDrip(封装格式为mkv)中视频与音频并重新封装为mp4
  15. 全面了解风控数据体系
  16. android svg格式图片,Android工程使用SVG图片
  17. 艾司博讯:拼多多子账户的操作流程
  18. 如何从JavaScript中的数组替换元素?
  19. 洛谷题目AC代码总结(未完成,日更题目中)
  20. Going to Redmond (keep moving)

热门文章

  1. MySQL 设计规范(续)
  2. Centos配置终端的快捷键
  3. DDoS攻击与CC攻击的区别
  4. Vivado 中IP报严重警告Could not find module的解决办法
  5. 宇宙飞行器的几种飞行原理设计
  6. Fiddler抓取数据并分析(完整的配置教程)
  7. React数据获取为什么一定要在componentDidMount里面调用?
  8. Tcpdump配合Tcpreplay回放实现网络探测
  9. Ora_Excel 碉堡了
  10. 构建高可用的LVS负载均衡集群 入门篇