题意:给你一个数m,有多少优惠券,给个n,主角想用多少优惠券。然后接下来时m行,每行两个数,那张优惠券的优惠区间a,b(在a号货物到b号货物之间的所有都可以优惠)

问你,能不能用k张优惠券,是他的优惠区间重叠的部分最大。

今天第一次看优先队列,居然还有这么神奇的东西,omg,太强了

思路就是排序,然后用优先队列乱搞一下。。。

接下来给出代码

#include <iostream>
#include <queue>
#include <algorithm>
#include <stdio.h>
using namespace std;

const int Maxn = 2147483647;

struct Node{
	int l,r;
	int i;
}node[300010];

bool cmp( const Node &a,const Node &b ){
	return ( a.l == b.l ? a.r < b.r:a.l < b.l );
}

int main(){
	int m,n;
	scanf("%d%d",&m,&n);
	for( int i = 1; i <= m; i++ ){
		scanf("%d%d",&node[i].l,&node[i].r);
		node[i].i = i;
	}
	sort( node+1,node+1+m,cmp );
	priority_queue<int,vector<int>,greater<int> > q;
	int inf = -Maxn;
	int x;
	int l,r;
	for( int i = 1; i <= m; i++ ){
		x = node[i].l;
		q.push( node[i].r );
		while( q.top() < x || q.size() > n ){
			q.pop();
		}
		if( q.size() == n ){
			if( inf < q.top() - x + 1 ){
				inf = q.top() - x + 1;
				l = x,r = q.top();
			}
		}
	}
	if( inf == - Maxn ){
		cout << '0' << endl;
		for( int i = 1; i <= n; i++ ){
			printf( "%d ",i );
		}
		printf( "\n" );
		exit(0);
	}else{
		cout << inf << endl;
		for( int i = 1; i <= m; i++ ){
			if( node[i].l <= l && node[i].r >= r ){
				printf("%d ",node[i].i);
				n--;
				if( n == 0 ){
					cout << '\n';
					exit(0);
				}
			}
		}
	}
}

cf754D的更多相关文章

随机推荐

  1. 计划任务实现定时备份mysql数据库

    1.linux平台 30 3 * * * sh /data/tools/mysqlbackup.sh  每天3点半备份数据库mysqlbackup.sh(备份最近5天的数据): #设置数据库名,数据库 ...

  2. 已经安装php后,再增加扩展模块(不重新编辑php)

    下面以安装curl为例,介绍具体安装步骤. 1.安装crul wget http://curl.haxx.se/download/curl-7.19.6.tar.gz tar -zxvf curl-7 ...

  3. POJ 2406 Power Strings 1961的简化版,kmp的next数组的应用

    题目: http://poj.org/problem?id=2406 跟1961差不多,题解就不写了,一开始理解错题了,导致WA一次. #include <stdio.h> #includ ...

  4. .Net Framework Data Provider可能没有安装

    方法一.下载SQL Server Compact 4.0 安装后就可以解决.下载地址是: http://www.microsoft.com/downloads/zh-cn/details.aspx?f ...

  5. C++中二维数组的动态创建与处理

    C++中用new动态创建二维数组的格式一般是这样: TYPE (*p)[N] = new TYPE [][N]; 其中,TYPE是某种类型,N是二维数组的列数.采用这种格式,列数必须指出,而行数无需指 ...

  6. Ubuntu 安装 JDK 7 / JDK8 的两种方式

    ubuntu 安装jdk 的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用pp ...

  7. 不用第三个变量,将a,b两个值互换,会出现什么样的异常?

    1 相互加减 a = a + b; b = a - b; a = a - b; 但会出现异常 如果a+b超过a类型的范围,俗称溢出异常. 2 指针操作交换地址 3 异或操作 转自网络搜索的答案

  8. 第 10 章 建造者模式【Builder Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我“牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的 ...

  9. POP3、SMTP、IMAP和Exchange的区别在哪里?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:永遇乐链接:http://www.zhihu.com/question/24605584/answer/29039357来源: ...

  10. 最简单的CRC32源码-逐BYTE法

    从按BIT计算转到按BYTE计算,要利用异或的一个性质,具体见前面的文章<再探CRC >. 其实方法跟逐BIT法是一样的,我们只是利用异或的性质,把数据分成一BYTE一BYTE来计算,一B ...