原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100187C.html

题目传送门 - CF-Gym100187C

题意

  给定 $n$ 个房间以及 $n$ 个人。

  第 $i$ 个房间的大小为 $a_i$。

  第 $i$ 个人要的房间的大小范围为 $[L_i,R_i]$ 。

  现在给每一个人安排房间,一个房间只能被一个人拥有。

  问是否存在方案满足条件。

  如果不存在,输出:Let's search for another office.

  如果存在多种方案,输出:Ask Shiftman for help.

  否则输出:Perfect! 并在第二行输出 $n$ 个数,第 $i$ 个数表示给第 $i$ 个人分配的房间编号。

题解

  首先我们不考虑多种解的情况。

  做法是个简单贪心。

  我们将房间按照 $a_i$ 升序排序。

  将人的需求按照 $L_i$ 升序排序。

  然后从左到右依次处理每一个房间。

  对于房间 $i$ ,我们从 $L$ 比他小的所有还没有被匹配的人中找到 $R_j$ 最小的(这个可以用一个堆来实现)。

  如果 $R_j<a_i$ 那么由于未匹配的房间中最小的就是 $a_i$,所以这个人一定无法匹配了,所以无解。

  否则让房间 $i$ 匹配第 $j$ 个人。显然让 $R_i$ 尽量小的先匹配时最优的。

  这样可以得到一组解。

  然后我们考虑如何判断是否多解。

  假设我们已经有了一个解。

  则,当且仅当下面的条件满足时,存在多解。

  条件: 存在两个人,选择的房间都在他们两个人都可以接受的范围内。

  于是我们要考虑如何来搞这个。

  考虑对于当前人选择的当前房间。我们找到满足“选择的房间比当前房间小的,可以接受的区间比当前房间大的”人中选择的房间尽量大的,判断这两个人的房间是否可以交换。如果有解,并至少存在一组这样的人,那么为多解。这个东西显然可以再用个堆搞定。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int n,a[N],b[N];
struct Node{
int a,id;
}v[N];
struct Seg{
int L,R,id;
Seg(){}
Seg(int _L,int _R){L=_L,R=_R;}
friend bool operator < (Seg a,Seg b){
return a.R>b.R;
}
}s[N];
int res[N];
bool cmpL(Seg a,Seg b){return a.L<b.L;}
bool cmpid(Seg a,Seg b){return a.id<b.id;}
bool cmpa(Node a,Node b){return a.a<b.a;}
priority_queue <Seg> Q,Q2;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&v[i].a),v[i].id=i;
sort(v+1,v+n+1,cmpa);
v[0].a=0,v[n+1].a=1e9+1;
for (int i=0;i<=n+1;i++)
a[i]=v[i].a,b[n+1-i]=1e9+1-v[i].a;
for (int i=1;i<=n;i++){
scanf("%d%d",&s[i].L,&s[i].R);
s[i].id=i;
s[i].L=lower_bound(a,a+n+2,s[i].L)-a;
s[i].R=n+1-(lower_bound(b,b+n+2,1e9+1-s[i].R)-b);
// printf("%d %d\n",s[i].L,s[i].R);
}
while (!Q.empty())
Q.pop();
while (!Q2.empty())
Q2.pop();
sort(s+1,s+n+1,cmpL);
bool flag=0;
for (int i=1,j=1;i<=n;i++){
while (j<=n&&s[j].L<=i)
Q.push(s[j++]);
if (Q.empty()){
puts("Let's search for another office.");
return 0;
}
Seg now=Q.top();
Q.pop();
if (now.R<i){
puts("Let's search for another office.");
return 0;
}
res[now.id]=v[i].id;
while (!Q2.empty()){
Seg Now=Q2.top();
if (Now.L<i){
Q2.pop();
continue;
}
if (now.L<=n-Now.R)
flag=1;
break;
}
Q2.push(Seg(now.R,n-i));
}
if (flag){
puts("Ask Shiftman for help.");
return 0;
}
puts("Perfect!");
for (int i=1;i<=n;i++)
printf("%d ",res[i]);
return 0;
}

  

Codeforces Gym100187C Very Spacious Office 贪心 堆的更多相关文章

  1. 【贪心+堆】XMU 1584 小明的烦恼

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1584 题目大意: 给n(n<=100 000)个任务的耗时和截至时间,问最少不能 ...

  2. BZOJ_2151_种树_贪心+堆+链表

    BZOJ_2151_种树_贪心+堆 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编 ...

  3. BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表

    BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...

  4. BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆

    BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是 ...

  5. 【bzoj4425】[Nwerc2015]Assigning Workstations分配工作站 贪心+堆

    题目描述 佩内洛普是新建立的超级计算机的管理员中的一员. 她的工作是分配工作站给到这里来运行他们的计算研究任务的研究人员. 佩内洛普非常懒惰,不喜欢为到达的研究者们解锁机器. 她可以从在她的办公桌远程 ...

  6. 【bzoj1029】[JSOI2007]建筑抢修 贪心+堆

    题目描述 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建 ...

  7. 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆

    题目描述 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他.如果要满足顾客的需求,就必须要有足够的库存.问 ...

  8. codeforces Gym 100338E Numbers (贪心,实现)

    题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...

  9. BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板 贪心 + 堆 + 反向思考

    Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50, ...

随机推荐

  1. python学习第42、43天 HTML\CSS

    前端是什么? 帮助不了解后端程序的客户轻松使用程序的工具,可以提升工作效率,提供各种各样的体验. 通用的前端大致会使用三种语言,用在三个不同的方面对前端进行架构和优化,这里也只介绍这三种 web前端常 ...

  2. python学习第9-10天,函数。

    函数初识 为什么要使用函数? 函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句. 函数的定义与 ...

  3. Python-爬虫-猫眼T100

    目标站点需求分析 涉及的库 from multiprocessing import Poolfrom requests.exceptions import RequestExceptionimport ...

  4. Codeforces Educational Codeforces Round 57 题解

    传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...

  5. mysql 定期删除表中无用数据

    MySQL5.1.x版本中引入了一项新特性EVENT,定期执行某些事物,这可以帮助我们实现定期执行某个小功能,不在依赖代码去实现. 我现在有一张表,这张表中的数据有个特点,每天都会有大量数据插入,但是 ...

  6. 纯webpack打包项目

    webpack 3 零基础入门教程 http://webpackbook.rails365.net/466996(文本) https://www.rails365.net/movies/webpack ...

  7. Confluence 6 开始使用

    欢迎来到 Confluence 的开始使用指南文档.在这个稳定中,你将会找到有关对 Confluence 进行评估的指南和其他的一些有用的内容.当你开始使用 Confluence 的时候,这些信息能够 ...

  8. window 上安装 Scala

    第一步:Java 设置 检测方法前文已说明,这里不再描述. 如果还为安装,可以参考我们的Java 开发环境配置. 接下来,我们可以从 Scala 官网地址 http://www.scala-lang. ...

  9. mysql 安装问题一:由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题。

    这种错误是由于未安装  vcredist  引起的 下载  vcredist  地址:https://www.microsoft.com/zh-CN/download/details.aspx?id= ...

  10. Redis的消息发布和订阅

    Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...