题目传送门

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 [贪心,二分,并查集]的更多相关文章

  1. 洛谷 P1525 关押罪犯 (贪心,扩展域并查集)

    题意:有\(n\)个罪犯,\(m\)对罪犯之间有仇,现在将这些罪犯分到两个监狱里去,问两个监狱里有仇罪犯之间的最大权值最小为多少. 题解:先按边权从大到小排序,然后贪心,边权大的两个罪犯,我们一定要先 ...

  2. 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]

    洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...

  3. Bzoj5188/洛谷P4185 [Usaco2018 Jan]MooTube(并查集)

    题面 Bzoj 洛谷 题解 最暴力的方法是直接判两个点之间的路径最小值是否\(\geq k\),用\(Dijkstra\)可以做到该算法最快效率,但是空间复杂度始终是\(O(n^2)\)的,会\(ML ...

  4. 洛谷P4004 Hello world!(分块+并查集)

    传送门 虽然洛谷数据水,然而咱最终还是没有卡过uoj上的毒瘤数据-- 神tm全uoj就3个人过了这题-- 首先,每个数最多被开根\(6\)次,开到\(1\)之后就别管它了,把它用并查集连到它父亲上 它 ...

  5. 【南开OJ2264】节操大师(贪心+二分+并查集/平衡树)

    好久没更新了,今天就随便写一个吧 题目内容 MK和他的小伙伴们(共n人,且保证n为2的正整数幂)想要比试一下谁更有节操,于是他们组织了一场节操淘汰赛.他们的比赛规则简单而暴力:两人的节操正面相撞,碎的 ...

  6. 洛谷P1196 银河英雄传说[带权并查集]

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  7. [洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  8. 【洛谷P3224】永无乡 并查集+Splay启发式合并

    题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...

  9. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]

    题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...

随机推荐

  1. python — 生成器、推导式、递归

    目录 1 生成器(函数的变异) 2 推导式 3 递归 1 生成器(函数的变异) 判断一个函数是否是生成器函数:只需看函数内部是否有yield # 生成器函数(内部是否包含yield) def func ...

  2. MySQL SELECT语法(二)SELECT...INTO语法

    源自MySQL 5.7 官方手册 SELECT...INTO Syntax 一.SELECT...INTO介绍 SELECT...INTO用来将查询结果存储在变量或者写入文件中. SELECT ... ...

  3. 关于RESTful API

    添几篇文章: 一.What Is REST? 二.RESTful API最佳实践 三.MS Azure——API Design 这些文章里面也推荐了一些关联文章,微软那篇最详细,非常值得一读.

  4. 01 Java 内存分配全面浅析

    http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析  本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...

  5. 从零开始使用mocha测试

    mocha 需要在node环境下跑,请确保已经安装了node   1.新建一个文件夹 test   2.命令行切换到test目录下,执行命令:npm init ,出现选择按enter,一系列选择完成之 ...

  6. vsCode设置代码片段

    输入vue.json { "Print to console": { "prefix": "vv", "body": [ ...

  7. jstl的forEach 循环

    jstl的forEach循环一般有两种格式 1.当需要操作循环的下标时,或者需要固定循环的次数时: <c:forEach begin="0" end="5" ...

  8. vue项目js实现图片放大镜功能

    效果图:   我写的是vue的组件形式,方便复用,图片的宽高,缩放的比例可以自己定义 magnifier.vue <template> <div class="magnif ...

  9. MySQL间隙锁问题

    间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间. 最近用户反馈说系统老是出现insert时,等待超时了,最后发现是ins ...

  10. wordpress程序打开太慢的解决方案(一步搞定)

    周末两天没有打开自己的赵一鸣随笔博客,今天访问了一下,打开速度太慢了,看看浏览器栏目,网站标题已经显示出来了,但是网页却是一片空白,什么都没有,刚开始以为是我们公司网速的问题,就没有特别注意这件事情. ...