本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

Description

All our characters have hobbies. The same is true for Fedor. He enjoys shopping in the neighboring supermarket.

The goods in the supermarket have unique integer ids. Also, for every integer there is a product with id equal to this integer. Fedor has ndiscount coupons, the i-th of them can be used with products with ids ranging from li to ri, inclusive. Today Fedor wants to take exactly kcoupons with him.

Fedor wants to choose the k coupons in such a way that the number of such products x that all coupons can be used with this product x is as large as possible (for better understanding, see examples). Fedor wants to save his time as well, so he asks you to choose coupons for him. Help Fedor!

Input

The first line contains two integers n and k (1 ≤ k ≤ n ≤ 3·105) — the number of coupons Fedor has, and the number of coupons he wants to choose.

Each of the next n lines contains two integers li and ri ( - 109 ≤ li ≤ ri ≤ 109) — the description of the i-th coupon. The coupons can be equal.

Output

In the first line print single integer — the maximum number of products with which all the chosen coupons can be used. The products with which at least one coupon cannot be used shouldn't be counted.

In the second line print k distinct integers p1, p2, ..., pk (1 ≤ pi ≤ n) — the ids of the coupons which Fedor should choose.

If there are multiple answers, print any of them.

Examples
input
4 21 10040 70120 130125 180

output
311 2 

input
3 21 1215 2025 30

output
01 2 

input
5 21 105 1514 5030 7099 100

output
213 4 

Note

In the first example if we take the first two coupons then all the products with ids in range [40, 70] can be bought with both coupons. There are 31 products in total.

In the second example, no product can be bought with two coupons, that is why the answer is 0. Fedor can choose any two coupons in this example.

正解:堆+贪心

解题报告:

  这道题概括出来的模型十分简洁经典:从n条线段中取出恰好k条使得交集长度尽可能长,输出最优值和方案。

  我开始想了很久的单调性,但是并不能实现单调决策,更不能还原历史版本。所以我就想了想,似乎带个log就很可做了?

  考虑先按左端点排序,维护一个右端点坐标的小根堆,那么很容易发现我只需要保证堆的大小始终小于等于k即可。当我每次扫到一个左端点时,将其右端点与堆顶作比较,如果比堆顶小则不作考虑,否则,删除堆顶,把这个新的右端点坐标加入堆中。每次只需用堆顶减去当前处理的线段的左端点来更新答案(当且仅当堆中恰好有k个元素)。输出方案的话,用同样方法再做一次即可。

//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MAXN = 300011;
int n,k,ans,dui[MAXN];
struct node{int pos,id; inline bool operator < (const node &a)const{ return a.pos<pos; } }tmp;
priority_queue<node>Q;
struct seq{int l,r,id;}a[MAXN];
inline bool cmp(seq q,seq qq){ return q.l<qq.l; }
inline int getint(){int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
}inline void work(){n=getint(); k=getint(); for(int i=1;i<=n;i++) a[i].l=getint(),a[i].r=getint(),a[i].id=i;sort(a+1,a+n+1,cmp); ans=-1;//!!!for(int i=1;i<=n;i++) {if(!Q.empty())tmp=Q.top();      if((int)Q.size()<k) {tmp.pos=a[i].r;tmp.id=i;Q.push(tmp);}else {if(a[i].r>tmp.pos) {Q.pop();            tmp.pos=a[i].r;tmp.id=i;Q.push(tmp);}}if((int)Q.size()>=k) ans=max(Q.top().pos-a[i].l,ans);}printf("%d\n",ans+1);if(ans==-1) { for(int i=1;i<=k;i++) printf("%d ",i); return ; }int lans=ans; ans=-1;while(!Q.empty()) Q.pop();for(int i=1;i<=n;i++) {if(!Q.empty()) tmp=Q.top();        if((int)Q.size()<k) {tmp.pos=a[i].r;tmp.id=a[i].id;//!!!Q.push(tmp);}else {if(a[i].r>tmp.pos) {Q.pop();         tmp.pos=a[i].r;tmp.id=a[i].id;//!!!Q.push(tmp);}}if((int)Q.size()>=k) {ans=max(Q.top().pos-a[i].l,ans);if(ans==lans) {int cnt=0;while(!Q.empty()) {tmp=Q.top();dui[++cnt]=tmp.id;Q.pop();}sort(dui+1,dui+k+1);for(int i=1;i<=k;i++) printf("%d ",dui[i]);return ;}}}
}int main()
{work();return 0;
}

  

转载于:https://www.cnblogs.com/ljh2000-jump/p/6258705.html

codeforces754D Fedor and coupons相关推荐

  1. Codeforces - Fedor and coupons

    题目链接:Codeforces - Fedor and coupons 先对左端点升序排序. 然后枚举要选的左端点最靠右的边,此时怎么选前面的点呢?肯定是选k个最大的右端点呀. 所以可以用个权值线段树 ...

  2. codeforces D. Fedor and coupons 贪心+优先队列

    题目地址:点击打开链接 D. Fedor and coupons time limit per test 4 seconds memory limit per test 256 megabytes i ...

  3. CF754D Fedor and coupons(堆)

    题目 我们所有的角色都有某些习惯.Fedor 也一样.他在邻近的超市享受购物. 超市的不同货物有不同的整数 ID.对于每个整数也有一个产品的 ID 和这个整数相同.Fedor 有 n n n 张折扣券 ...

  4. cf 754D Fedor and coupons

    一 原题 D. Fedor and coupons time limit per test 4 seconds memory limit per test 256 megabytes input st ...

  5. CodeForces 754D Fedor and coupons

    题目链接:http://codeforces.com/contest/754/problem/D 题意:给你n个优惠券,每个优惠券是一个区间,他能给这个区间的所有商品进行打折,现让你选择k个优惠券,使 ...

  6. 『优先队列』Fedor and coupons

    题目描述 . 题解 这道题可以得到一个结论就是,重叠区间的左端点一定是某一条线段的左端点:否则可以往左移到左端点处来使得答案更优.因此我们可以枚举左端点,查找向右的 k k k 条线段中坐标最小的最大 ...

  7. 专题突破之反悔贪心——建筑抢修,Cow Coupons G, Voting (Hard Version),Cardboard Box

    文章目录 [JSOI2007]建筑抢修 [USACO12FEB]Cow Coupons G CF1251E2 Voting (Hard Version) CF436E Cardboard Box [J ...

  8. 介绍一个很好的网站店铺推广优惠券插件 - URL Coupons

    优惠券是促进店铺访问者转化购买的很好手段. 今天我介绍一个很好的店铺优惠券插件 - URL Coupons,它允许你给店铺的优惠券添加一个URL.当这个URL被点击的时候,它会自动使用优惠券,并将商品 ...

  9. 淘客项目coupons在 Linux 环境部署指南

    本篇文章主要是记录Coupons项目在Linux环境下的安装过程 Coupons是一个从前端到后端完全开源的淘宝客项目,当初学习完uniapp之后想做一个实战项目,所以才研发了这个项目.由于本人平时主 ...

最新文章

  1. 制胜人工智能时代——企业人工智能应用现状分析(第三版)
  2. jQuery Datatables常用配置
  3. python车牌识别逆光怎么办代码_这摄像头除了能逆光识别车牌,还会跟人打招呼?...
  4. kaggle(01)-泰坦尼克号问题
  5. 算法篇【枚举2 -- 生理周期】
  6. onvif学习笔记1:环境准备
  7. python常见的控制流结构有_【Python】控制流语句、函数、模块、数据结构
  8. spring cloud 学习笔记(1)
  9. Linux 命令大全(超全实用型)
  10. DSP28335学习记录(二)——外部中断和定时器中断
  11. 微信朋友圈装x代码_朋友圈生成器有哪些_微信朋友圈生成器大全_微信朋友圈装逼生成器下载_飞翔软件专题...
  12. Opencv图像特征点提取(
  13. UAT:它也是一种“群体测试”吗?
  14. 人才数据报告不会写?指标不明晰?这套人力资源方案帮你统统解决
  15. 新氧《2021中国医美抗衰消费趋势报告》:医美抗衰市场规模超755亿元
  16. Minecraft 1.16.5模组开发(五十四) 方块探测器(Detector)
  17. 浅析微信支付:开通社交立减金活动、创建立减金及领取使用的相关文档和源码
  18. imovie的快速入门
  19. 开年捞金蓝海项目,实操一天就赚了五百多
  20. 杂记:Word在试图打开文件时遇到错误/Word在.docx中发现无法读取的内容

热门文章

  1. 《机器学习》李宏毅(21P5-9)
  2. R语言实战应用精讲50篇(二十八)-R语言时空数据分析实战案例-数据处理及可视化
  3. c语言实现演唱会歌迷排队买票问题
  4. 文档翻译(0)-Boost软件许可证
  5. 学习笔记9-DHT11
  6. 【2019 ITIP】Spatial-Temporal Attention-Aware Learning for Video-Based Person Re-Identification
  7. davinci的使用和部署
  8. stm32cubemx PWM
  9. K-Dimensional Foil HihoCoder - 1628 线性代数 解方程
  10. 即时通讯源码-即时通讯集群服务免费-通讯百万并发技术-Openfire 的安装配置教程手册-哇谷即时通讯集群方案-哇谷云-哇谷即时通讯源码