Never be limited by other people's|

zyc_xianyu

园龄:3年7个月粉丝:4关注:4

CSP2020廊桥分配

[CSP-S 2021] 廊桥分配

题目描述

当一架飞机抵达机场时,可以停靠在航站楼旁的廊桥,也可以停靠在位于机场边缘的远机位。乘客一般更期待停靠在廊桥,因为这样省去了坐摆渡车前往航站楼的周折。然而,因为廊桥的数量有限,所以这样的愿望不总是能实现。

机场分为国内区和国际区,国内航班飞机只能停靠在国内区,国际航班飞机只能停靠在国际区。一部分廊桥属于国内区,其余的廊桥属于国际区。

L 市新建了一座机场,一共有 n 个廊桥。该机场决定,廊桥的使用遵循“先到先得”的原则,即每架飞机抵达后,如果相应的区(国内/国际)还有空闲的廊桥,就停靠在廊桥,否则停靠在远机位(假设远机位的数量充足)。该机场只有一条跑道,因此不存在两架飞机同时抵达的情况。

现给定未来一段时间飞机的抵达、离开时刻,请你负责将 n 个廊桥分配给国内区和国际区,使停靠廊桥的飞机数量最多。

输入格式

输入的第一行,包含三个正整数 n,m1,m2,分别表示廊桥的个数、国内航班飞机的数量、国际航班飞机的数量。

接下来 m1 行,是国内航班的信息,第 i 行包含两个正整数 a1,i,b1,i,分别表示一架国内航班飞机的抵达、离开时刻。

接下来 m2 行,是国际航班的信息,第 i 行包含两个正整数 a2,i,b2,i,分别表示一架国际航班飞机的抵达、离开时刻。

每行的多个整数由空格分隔。

输出格式

输出一个正整数,表示能够停靠廊桥的飞机数量的最大值。

样例 #1

样例输入 #1

3 5 4
1 5
3 8
6 10
9 14
13 18
2 11
4 15
7 17
12 16

样例输出 #1

7

样例 #2

样例输入 #2

2 4 6
20 30
40 50
21 22
41 42
1 19
2 18
3 4
5 6
7 8
9 10

样例输出 #2

4

样例 #3

样例输入 #3

见附件中的 airport/airport3.in

样例输出 #3

见附件中的 airport/airport3.ans

提示

【样例解释 #1】

在图中,我们用抵达、离开时刻的数对来代表一架飞机,如 (1,5) 表示时刻 1 抵达、时刻 5 离开的飞机;用 表示该飞机停靠在廊桥,用 × 表示该飞机停靠在远机位。

我们以表格中阴影部分的计算方式为例,说明该表的含义。在这一部分中,国际区有 2 个廊桥,4 架国际航班飞机依如下次序抵达:

  1. 首先 (2,11) 在时刻 2 抵达,停靠在廊桥。
  2. 然后 (4,15) 在时刻 4 抵达,停靠在另一个廊桥。
  3. 接着 (7,17) 在时刻 7 抵达,这时前 2 架飞机都还没离开、都还占用着廊桥,而国际区只有 2 个廊桥,所以只能停靠远机位。
  4. 最后 (12,16) 在时刻 12 抵达,这时 (2,11) 这架飞机已经离开,所以有 1 个空闲的廊桥,该飞机可以停靠在廊桥。

根据表格中的计算结果,当国内区分配 2 个廊桥、国际区分配 1 个廊桥时,停靠廊桥的飞机数量最多,一共 7 架。

【样例解释 #2】

当国内区分配 2 个廊桥、国际区分配 0 个廊桥时,停靠廊桥的飞机数量最多,一共 4 架,即所有的国内航班飞机都能停靠在廊桥。

需要注意的是,本题中廊桥的使用遵循“先到先得”的原则,如果国际区只有 1 个廊桥,那么将被飞机 (1,19) 占用,而不会被 (3,4)(5,6)(7,8)(9,10)4 架飞机先后使用。

【数据范围】

对于 20% 的数据,n100m1+m2100
对于 40% 的数据,n5000m1+m25000
对于 100% 的数据,1n105m1,m21m1+m2105,所有 a1,i,b1,i,a2,i,b2,i 为数值不超过 108 的互不相同的正整数,且保证对于每个 i[1,m1],都有 a1,i<b1,i,以及对于每个 i[1,m2],都有 a2,i<b2,i

解答

#include<bits/stdc++.h>
#define rt register int 
using namespace std;
int n,m1,m2,ans1[100005],ans2[100005];
int res;
#define pii pair<int,int>
set<pii > a,b;
set<pii > :: iterator id;
pii tmp;
inline int read(){
	int f=1,x=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return f*x;
}
inline void write(int x){
	if(x<0){
		putchar('-');x=-x;
	}
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
}
inline int worka(){
	int res=0,now=0;
	while(true){
		id=a.lower_bound(make_pair(now,now));
		if(id==a.end())break;
		++res;now=id->second;
		a.erase(id);
	}
	return res;
}
inline int workb(){
	int res=0,now=0;
	while(true){
		id=b.lower_bound(make_pair(now,now));
		if(id==b.end())break;
		++res;now=id->second;
		b.erase(id);
	}
	return res;
}
int main(){
	n=read();m1=read();m2=read();
	for(rt i=1;i<=m1;++i)
	{
		tmp.first=read();tmp.second=read();
		a.insert(tmp);
	}
	for(rt i=1;i<=m2;++i)
	{
		tmp.first=read();tmp.second=read();
		b.insert(tmp);
	}
	ans1[0]=0;ans2[0]=0;
	for(rt i=1;i<=n;++i)
		ans1[i]=ans1[i-1]+worka();
	for(rt i=1;i<=n;++i)
		ans2[i]=ans2[i-1]+workb();
	for(rt i=0;i<=n;++i)
		res=max(res,ans1[i]+ans2[n-i]);
	write(res);
}

本文作者:zychh

本文链接:https://www.cnblogs.com/zychh/p/16743671.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   zyc_xianyu  阅读(69)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起