洛谷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$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...
随机推荐
- ffmpeg AVPacket结构体及其相关函数
0. 简介 AVPacket结构体并不是很复杂, 但是在ffmpeg中用的非常多. 与其相关的函数也是比较多. AVPacket保存了解复用之后, 解码之前的数据, 和这些数据相关的一些附加信息. 对 ...
- 整体二分(模板一)静态区间第K大
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...
- 笔记-2:python基本数据类型
1.数字类型 1.1 整数类型 整数类型有4种进制表示:十进制,二进制,八进制,十六进制,默认情况下,整数采用十进制. 整数类型有4种进制:十进制. 二进制. 八进制和十六进制. 默认情况, 整数采用 ...
- 【第一季】CH07_FPGA_RunLED创建VIVADO工程实验
[第一季]CH07_FPGA_RunLED创建VIVADO工程实验 7.1 硬件图片 先来熟悉一下开发板的硬件:LED部分及按钮部分 7.2 硬件原理图 PIN脚定义(讲解以MIZ702讲解,MIZ7 ...
- Java门面模式(思维导图)
图1 门面模式[点击查看图片] 1,实体对象类 package com.cnblogs.mufasa.demo1; //3个子系统,解决问题的实体 public class StoreA { //示意 ...
- 前端vue项目执行npm install 报错cd() never called()
前端我刚开始接触Vue,从GitHub上下载了代码程序,但缺少一些插件,用vscode打开并下载插件执行报错cd() never called! 解决的方式 1.执行cmd命令行不要再vscode里执 ...
- asp.net mvc4 学习1
1 简介:微软在很早就看到了基于windows系统的web开发平台的需求,这时便开始提出自己的解决方案即微软的第一个基于web开发的平台ASP.再后来随着需求和性能的要求再2002年推出第二个解决方案 ...
- 【1】Git基础
一.Git概念 1.1.Git定义 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发 ...
- Airflow安装错误:sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError)
1 完整的异常信息: raise errorclass, errorvalue sqlalchemy.exc.OperationalError: (_mysql_exceptions.Operatio ...
- IDEA中使用git合并分支的过程报错:cant checkout because of unmerged files
使用idea的git插件控制代码分支合并时,由于操作不当,报错了,控制台报错如下: cant checkout because of unmerged files,you have to resolv ...