首页 > 其他分享 >[CSP-S 2021] 廊桥分配

[CSP-S 2021] 廊桥分配

时间:2024-07-15 10:53:36浏览次数:9  
标签:arrival 飞机 int ll 2021 m2 廊桥 CSP

戳我跳转题面

题意

一共有 n 个廊桥,全部分配给互相独立的两组。第一组有 $m1$ 个区间 $[l_i,r_i]$, 第二组有 $m2$ 个区间 $[a_i,b_i]$(互相独立),一旦有廊桥空着,就会将 $i$ 区间覆盖于总区间。问一共能满足多少个区间。

思路

45pts

由于两组的处理方法几乎一样,在这里只举第一组的例子。

首先最重要的是要排个序,因为“先到先得”原则,自是按照左端点排序。
然后暴力枚举分配给第一组的廊桥个数 $i$,接着就可以 $O(1)$ 求出第二组的廊桥数量 $j$。再下去就模拟一下飞机的入场,用一个优先队列来存放正在使用的廊桥数量。如果廊桥中的飞机在当前飞机 $k$ 到达之前就应该走了,那么就将这架飞机弹出队列。最后看一下当前飞机能否入场,可以的话将飞机插入队列。答案就是枚举过程中能够停靠的飞机的总数的 $max$。

View
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 100010;
struct node
{
	ll arrival, departure;
} a[N], b[N];
ll n, m1, m2, ans;

bool cmp(node x, node y) {return x.arrival < y.arrival;}

int main()
{
	//freopen("airport.in", "r", stdin);
	//freopen("airport.out", "w", stdout);
	ans = 0;
	scanf("%lld%lld%lld", &n, &m1, &m2);
	for (int i = 1; i <= m1; i++)
	{
		scanf("%lld%lld", &a[i].arrival, &a[i].departure);
	}
	for (int i = 1; i <= m2; i++)
	{
		scanf("%lld%lld", &b[i].arrival, &b[i].departure);
	}
	sort(a + 1, a + m1 + 1, cmp);
	sort(b + 1, b + m2 + 1, cmp);
	for (int i = 0; i <= n; i++)
	{
		priority_queue <ll, vector <ll>, greater <ll> > q, q2;
		ll j, tmp;
		j = n - i, tmp = 0;
		for (int k = 1; k <= m1; k++)
		{
			while (!q.empty() && q.top() < a[k].arrival) q.pop();
			if (q.size() < i) q.push(a[k].departure), tmp++;
		}
		for (int k = 1; k <= m2; k++)
		{
			while (!q2.empty() && q2.top() < b[k].arrival) q2.pop();
			if (q2.size() < j) q2.push(b[k].departure), tmp++;
		}
		ans = max(ans, tmp);
	}
	printf("%lld\n", ans);
	return 0;
}

100pts

也就是相比45分暴力多了那么一点点优化。

排序是必须的,所以先按左端点排序。

然后我们分析一下暴力的复杂度,排序 $O(m1logm1+m2logm2)$,枚举 $O(n^2 ·(m1+m2))$,而这个 $O(n^2)$ 才是最大的问题。

其实我们可以设置 $res_{1,i}, res_{2,i}$ 分别表示第一组、第二组给 $i$ 个廊桥的最大停靠飞机数量。

主要部分伪代码奉上:

/*枚举所有有飞机*/
{
    	while (/*当堆顶飞机应该走的时候/*) /*加入空的廊桥队列,并从原堆pop该飞机*/
        /*如果根本就没有廊桥是空的,说明当前飞机不可能进入廊桥*/
        /*取出该飞机并加入答案*/
        /*加入该飞机*/
 }

最后一定要先加前缀和,然后 $ans=max (res_{1,i},res_{2,n-i})$。


Talk is cheap, show me the code.

View
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 100010;
struct node
{
	ll arrival, departure;
} a[N], b[N];
ll n, m1, m2, ans;

bool cmp(node x, node y) {return x.arrival < y.arrival;}

int main()
{
	//freopen("airport.in", "r", stdin);
	//freopen("airport.out", "w", stdout);
	ans = 0;
	scanf("%lld%lld%lld", &n, &m1, &m2);
	for (int i = 1; i <= m1; i++)
	{
		scanf("%lld%lld", &a[i].arrival, &a[i].departure);
	}
	for (int i = 1; i <= m2; i++)
	{
		scanf("%lld%lld", &b[i].arrival, &b[i].departure);
	}
	sort(a + 1, a + m1 + 1, cmp);
	sort(b + 1, b + m2 + 1, cmp);
	for (int i = 0; i <= n; i++)
	{
		priority_queue <ll, vector <ll>, greater <ll> > q, q2;
		ll j, tmp;
		j = n - i, tmp = 0;
		for (int k = 1; k <= m1; k++)
		{
			while (!q.empty() && q.top() < a[k].arrival) q.pop();
			if (q.size() < i) q.push(a[k].departure), tmp++;
		}
		for (int k = 1; k <= m2; k++)
		{
			while (!q2.empty() && q2.top() < b[k].arrival) q2.pop();
			if (q2.size() < j) q2.push(b[k].departure), tmp++;
		}
		ans = max(ans, tmp);
	}
	printf("%lld\n", ans);
	return 0;
}

都看到这里了,点个关注再走呗 qwq

标签:arrival,飞机,int,ll,2021,m2,廊桥,CSP
From: https://www.cnblogs.com/Rainbow-Prism/p/18302718

相关文章

  • 2021杭电多校10 D.Pty hates prime numbers题解
    前言暑期第三次组队赛是选的21年杭电多校10,遗憾爆0,被对面队打爆,赛后狠狠补题。这道题的题解,以及网上搜到的其他题解看了好久没看懂,在问了队里大腿多次后,总算磨出来了,这里讲一下我的理解。题意多次询问,每次给定\(n\)和\(k\),如果一个数的质因数里包括前\(k\)个质数,则这个数......
  • [EGOI2021] Luna likes Love 的题解
    题目大意有\(2\timesn\)个人站成一排,然后给每个人分配一个\(1\)至\(n\)之间的数字,每种数字出现\(2\)次。现在,你可以进行两种操作:删除操作,将数字相同且相邻的两人删除,删除后两端剩下的队列合并。交换操作,交换相邻两个人的位置。每次,问至少操作多少次能够删除所有人......
  • 【比赛】CSP提高组模拟1
    和初三学长们一起打的比赛,被人家爆杀了。T1最短路20Pts原题CowTollPathsG。正解是按点权排序后跑一遍Floyd,歪解是多迭代几遍。赛时没开longlong\(80\to20\)。点击查看代码#include<bits/stdc++.h>#defineintllusingnamespacestd;typedeflonglongll......
  • GB/T 40429-2021 汽车驾驶自动化分级
    中国国家标准GB/T40429-2021《汽车驾驶自动化分级》文章目录中国国家标准GB/T40429-2021《汽车驾驶自动化分级》前言1范围2术语和定义3驾驶自动化分级3.1驾驶自动化分级原则3.2驾驶自动化等级划分要素3.3驾驶自动化等级划分3.3.10级驾驶自动化3.3.21级驾驶自动化3.3.......
  • CSP-J/S 报名全攻略(含考纲)
    CSP-J/S报名全攻略时间安排报名/认证时间指导教师7月10日起开始注册,认证者7月17日开始注册报名。具体各角色注册报名时间请见第一轮认证工作流程(如下)考试时间CCF内容一、简介CCF面向社会非专业人士推出CSP非专业级别软件能力认证。非专业级别能力认证CSP-J/S分两个级......
  • 纪念品(2019CSP-J)
    题目描述    小伟突然获得一种超能力,他知道未来T天N种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。    每天,小伟可以进行以下两种交易无限次:任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;......
  • [GKCTF 2021]easycms 1
    cms因为hint中告诉我们登录密码是弱口令,所以我们直接登陆就可以扫描后台找到了admin.php这个登录页面直接弱口令admin12345登录上去可以找到这里有一个控制主页面的可执行代码,如果我们改成木马就可以拿到shell了但是这里我们没有找到这个文件但是在设计->组件->素材库中有......
  • 2023CSP真题+答案+解析
    一、 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)1. 在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?()。A. unsigned B. const C. static D. mutable答案:B在C++中,关键字const用于声明一个变量,表示其值是常量,不能被修改。一旦用con......
  • CSP 模拟 1
    T1最短路(P2966[USACO09DEC]CowTollPathsG)考察Floyd的理解,Floyd本身是\(O(n^3)\)的空间复杂度。\(f_{k,i,j}\)表示只经过前\(k\)个点(不包含\(i,j\)),从\(i\)到\(j\)的最短距离。发现这个\(k\)的顺序是没有任何影响的。所以以点权的顺序枚举\(k\),这样保证算......
  • CSP提高组模拟1
    T1很明显的最短路floyed算法,但是这个最大的点权却不是很好维护,但我们可以想到枚举最大的点权其实就可以相当于枚举floyed中的k,那么这时我们要对k进行一个排序操作,使得我们每次枚举的中转点k为枚举经过路径的点权最大的点从而达到同时走最短路并维护点权最大值。点击查看代码#......