洛谷P4698 [CEOI2011]Hotel [贪心,二分,并查集]
Hotel
题目描述
你经营着一家旅馆,这家旅馆有 n 个房间,每个房间有维护费用和容量。其中第 i 个房间的维护费用为 ci,容量为 pi 人。
现在有 m 个订单,每个订单有两个参数:vi,di ,其中 vi 表示这个订单支付的租金,di 表示人数。
你现在得要合理选择一些订单,并放弃其他订单,使得每个选择的订单被安排在同一间房间内,且人数不超过这个房间的容量限制。当然,两个不同的订单也不能被安排在同一间房间内。
现在你想要知道,在最多选出o 个订单时的最大收益。一个方案的收益的定义为,选出的订单的租金和,减去选出的房间的维护费用和。
输入格式
第一行三个空格隔开的整数n,m,o 。
接下来 n 行,每行两个空格隔开的整数 ci,pi。
接下来 m 行,每行两个空格隔开的整数 vi,di。
输出格式
一行一个整数表示最大收益。注意答案可能很大。
输入输出样例
输入
3 2 2
150 2
400 3
100 2
200 1
700 3
400
说明/提示
样例 11 解释
可以将第一个订单安排至第三个房间,将第二个订单安排至第二个房间。
数据范围
对于 100% 的数据,有 1≤n,m≤500 000;1≤o≤min(n,m);1≤ci,pi,vi,di≤109,保证 ∀1≤i,j≤n,若pi<pj,则ci≤cj。
分析:
很容易想到的贪心,优先选择价值大且人数少的订单,对于每一个订单又优先选择容量小且花费小的房间。
所以先对房间和订单排序,房间按照容量与花费排序,订单按价值和人数排序。然后二分查找找到一个人数足够花费最小的房间,记录得到的收益,然后对所有收益排序取最大的$o$个。
但问题在于一个房间可能已经被之前的订单占用了,所以用并查集维护一下,如果一个房间$x$被使用了,就令$fa[x]$等于$x-1$,因为显然这样是最优的。当然注意一下当搜到的房间的$fa$为$0$时不能记录。
Code:
//It is made by HolseLee on 11th Aug 2019
//Luogu.org P4698
#include<bits/stdc++.h>
using namespace std; const int N=5e5+;
int n,m,o,fa[N],mon[N];
long long ans;
struct Room {
int cos,p;
bool operator < ( const Room A ) const {
return p==A.p ? cos>A.cos : p>A.p;
}
}a[N];
struct Custom {
int val,num;
bool operator < ( const Custom A ) const {
return val==A.val ? num<A.num : val>A.val;
}
}b[N]; inline int read()
{
int x=; char ch=getchar();
while( ch<'' || ch>'' ) ch=getchar();
while( ch>='' && ch<='' ) {
x=x*+ch-''; ch=getchar();
}
return x;
} int search(int v)
{
int l=, r=n, mid, ret=;
while( l<=r ) {
mid=l+r>>;
if( a[mid].p>=v ) ret=mid, l=mid+;
else r=mid-;
}
return ret;
} int find(int x)
{
return fa[x]==x ? x : fa[x]=find(fa[x]);
} int main()
{
n=read(), m=read(), o=read();
for(int i=; i<=n; ++i) {
a[i].cos=read(), a[i].p=read(); fa[i]=i;
}
for(int i=; i<=m; ++i) {
b[i].val=read(), b[i].num=read();
}
sort(a+,a+n+); sort(b+,b+m+);
//for(int i=1; i<=n; ++i) cout<<a[i].cos<<' '<<a[i].p<<'\n';
//for(int i=1; i<=m; ++i) cout<<b[i].val<<' '<<b[i].num<<'\n';
int x,tot=,sum=;
for(int i=; i<=m; ++i) {
x=search(b[i].num);
x=find(x);
if( x ) {
if( b[i].val-a[x].cos<= ) continue;
mon[++tot]=(b[i].val-a[x].cos);
fa[x]=x-;
}
}
sort(mon+,mon+tot+);
for(int i=tot; i>; --i) {
ans+=mon[i]; sum++;
if( sum==o ) break;
}
printf("%lld\n",ans);
return ;
}
洛谷P4698 [CEOI2011]Hotel [贪心,二分,并查集]的更多相关文章
- 洛谷 P1525 关押罪犯 (贪心,扩展域并查集)
题意:有\(n\)个罪犯,\(m\)对罪犯之间有仇,现在将这些罪犯分到两个监狱里去,问两个监狱里有仇罪犯之间的最大权值最小为多少. 题解:先按边权从大到小排序,然后贪心,边权大的两个罪犯,我们一定要先 ...
- 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]
洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...
- Bzoj5188/洛谷P4185 [Usaco2018 Jan]MooTube(并查集)
题面 Bzoj 洛谷 题解 最暴力的方法是直接判两个点之间的路径最小值是否\(\geq k\),用\(Dijkstra\)可以做到该算法最快效率,但是空间复杂度始终是\(O(n^2)\)的,会\(ML ...
- 洛谷P4004 Hello world!(分块+并查集)
传送门 虽然洛谷数据水,然而咱最终还是没有卡过uoj上的毒瘤数据-- 神tm全uoj就3个人过了这题-- 首先,每个数最多被开根\(6\)次,开到\(1\)之后就别管它了,把它用并查集连到它父亲上 它 ...
- 【南开OJ2264】节操大师(贪心+二分+并查集/平衡树)
好久没更新了,今天就随便写一个吧 题目内容 MK和他的小伙伴们(共n人,且保证n为2的正整数幂)想要比试一下谁更有节操,于是他们组织了一场节操淘汰赛.他们的比赛规则简单而暴力:两人的节操正面相撞,碎的 ...
- 洛谷P1196 银河英雄传说[带权并查集]
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- [洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- 【洛谷P3224】永无乡 并查集+Splay启发式合并
题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...
- 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...
随机推荐
- python — 生成器、推导式、递归
目录 1 生成器(函数的变异) 2 推导式 3 递归 1 生成器(函数的变异) 判断一个函数是否是生成器函数:只需看函数内部是否有yield # 生成器函数(内部是否包含yield) def func ...
- MySQL SELECT语法(二)SELECT...INTO语法
源自MySQL 5.7 官方手册 SELECT...INTO Syntax 一.SELECT...INTO介绍 SELECT...INTO用来将查询结果存储在变量或者写入文件中. SELECT ... ...
- 关于RESTful API
添几篇文章: 一.What Is REST? 二.RESTful API最佳实践 三.MS Azure——API Design 这些文章里面也推荐了一些关联文章,微软那篇最详细,非常值得一读.
- 01 Java 内存分配全面浅析
http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...
- 从零开始使用mocha测试
mocha 需要在node环境下跑,请确保已经安装了node 1.新建一个文件夹 test 2.命令行切换到test目录下,执行命令:npm init ,出现选择按enter,一系列选择完成之 ...
- vsCode设置代码片段
输入vue.json { "Print to console": { "prefix": "vv", "body": [ ...
- jstl的forEach 循环
jstl的forEach循环一般有两种格式 1.当需要操作循环的下标时,或者需要固定循环的次数时: <c:forEach begin="0" end="5" ...
- vue项目js实现图片放大镜功能
效果图: 我写的是vue的组件形式,方便复用,图片的宽高,缩放的比例可以自己定义 magnifier.vue <template> <div class="magnif ...
- MySQL间隙锁问题
间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间. 最近用户反馈说系统老是出现insert时,等待超时了,最后发现是ins ...
- wordpress程序打开太慢的解决方案(一步搞定)
周末两天没有打开自己的赵一鸣随笔博客,今天访问了一下,打开速度太慢了,看看浏览器栏目,网站标题已经显示出来了,但是网页却是一片空白,什么都没有,刚开始以为是我们公司网速的问题,就没有特别注意这件事情. ...