首页 > 其他分享 >CSP2021-s题解

CSP2021-s题解

时间:2022-09-18 19:22:05浏览次数:99  
标签:cnt 航班 CSP2021 题解 int 枚举 廊桥 分配

T1 廊桥分配

题目链接 P7913 [CSP-S 2021] 廊桥分配

\(Lemma:\) 对于已经存在的廊桥集合,加入新的廊桥不会影响之前分配好的航班。

证明: 由于题目所给限制,若有空廊桥,则航班一定会停在空廊桥,直至该航班离开,廊桥再次空置,下一个符合条件的航班使用该廊桥。有空置廊桥不必讨论;而在所有廊桥都被占满的期间,显然加入新的廊桥不会影响已经停靠的航班。

而国内和国际航班是独立的,因此分别讨论即可。维护一个航班的序列,枚举廊桥个数 \(1\)~\(n\)(\(0\) 不必枚举,因为必然妹有飞机停靠在廊桥)。设已经分配了 \(k\) 个廊桥,每当廊桥个数 \(+1\),即加入一个空廊桥(显然不影响已经分配好的\(k\)个廊桥和航班),将剩余未停靠航班中最先到的航班取出并使它“停靠在廊桥”,然后删除该航班,继续枚举下一个符合条件的航班并从航班序列中删除,直至不存在符合条件的航班。

这样做可以看作维护了很多个“航班集合”,这些航班集合满足了时间区间互不相交,且按抵达时间排列。

一种实现方法如下:

void count(int n, int *cnt) { // cnt[k] 表示k个廊桥可以停靠的航班数
	for(int i = 1; i <= n; ++i) {
		int pos = 0, idx = 0;
                // s为现存航班序列,按照左端点排序(为什么?请读者思考)
		while(true) {
			it = s.lower_bound(flight(pos, 0));
			if(it == s.end()) break;
			pos = (*it).r;
			s.erase(it);
			++idx;
		}
		cnt[i] = cnt[i - 1] + idx;
	}
}

分别处理国内和国际航班得到两个 \(cnt\) 数组,答案即为 \(\max \limits_{i=0}^{n}cnt_i+cnt^{'}_{n-i}\)。

注意坑点 \(i\) 从 \(0\) 开始枚举而不是 \(1\),因为国内(或国际)航班的廊桥个数可以为 \(0\)。

完整代码见文末(请勿抄袭)。

未完待续

各题完整代码

T1 廊桥分配

#include <bits/stdc++.h>
using namespace std;

struct flight {
	int l, r;
	bool operator < (const flight &x) const {
		return l < x.l;
	}
	flight(int a, int b) : l(a), r(b) {}
};

set<flight> s;
set<flight> :: iterator it;

const int N = 1e5 + 5;
int cnt1[N], cnt2[N];

void count(int n, int *cnt) {
	for(int i = 1; i <= n; ++i) {
		int pos = 0, idx = 0;
		while(true) {
			it = s.lower_bound(flight(pos, 0));
			if(it == s.end()) break;
			pos = (*it).r;
			s.erase(it);
			++idx;
		}
		cnt[i] = cnt[i - 1] + idx;
	}
}

int main() {
	int n, m1, m2, ans = 0;
	scanf("%d %d %d", &n, &m1, &m2);
	for(int i = 1, x, y; i <= m1; ++i)
		scanf("%d %d", &x, &y), s.insert(flight(x, y));
	count(n, cnt1);
	s.clear();
	for(int i = 1, x, y; i <= m2; ++i)
		scanf("%d %d", &x, &y), s.insert(flight(x, y));
	count(n, cnt2);
	for(int i = 0; i <= n; ++i)
		ans = max(ans, cnt1[i] + cnt2[n - i]);
	printf("%d\n", ans);
	return 0;
}

标签:cnt,航班,CSP2021,题解,int,枚举,廊桥,分配
From: https://www.cnblogs.com/Ning-H/p/16705483.html

相关文章

  • CSP2021初赛游记
    csp2022开打,把去年的游记找出来,在这里补了CSP2021初赛游记早上7:30去省初门口等crxis,可以和他一起做地铁去,然而最后也就3个学生,准确来说是3个学生加1个家长在等。我当时......
  • Luogu P3674 小清新人渣的本愿 题解
    P3674小清新人渣的本愿lxl大爷的题,%%%%%以及CSPrp++!!!前言:其实是这题的名字吸引了我,毕竟人渣的本愿里的角色我觉得多多少少都沾点,哪来的小清新啊。《人渣的本愿》,又名......
  • 牛客题解 约瑟夫环
    链接:https://ac.nowcoder.com/acm/problem/22227来源:牛客网题解作者岛田小雅正统的约瑟夫环我不会,看了一眼范围直接开始乱搞了。我选择的方法是模拟,用递归函数实现(虽......
  • 2022上半年软件设计师真题解析
    选择题 ......
  • AtCoder Beginner Contest 269 (A-F)题解
    A-AnywayTakahashi这里我还是关了ll的C开了忘了关害的F多了一发罚时#include<bits/stdc++.h>usingnamespacestd;constintN=3e5+10;constintM=9982443......
  • 题解【CF1702G2 Passable Paths (hard version)】
    题目传送门。考虑建立虚树然后再上面搞树形DP。于是这道题就变成分讨题。设\(f_i\)表示\(i\)子树内的答案。若\(f_i=1\),表示\(i\)子树内的特殊点可以被一条链覆......
  • CF1718D 题解
    设\(k\)为\(a\)中的空位数量。首先咱们转化这个“相似”的条件,发现它其实是说,笛卡尔树的结构相同。那么我们把p建笛卡尔树然后把a的数往上填。如果此时有上面小于下......
  • Android安卓浏览器视频层级永远顶层问题解决方案
    在安卓手机上,使用video播放视频有个问题,video控件层级会永远在顶层,不利于视频互动H5开发,而IOS手机上不会有此问题。腾讯给出了如下解决方案:<videosrc="http://xxx.mp4......
  • AtCoder Beginner Contest 267 题解
    只会\(A\simG\)主观难度:\(A<B<C<E<D<F<G<Ex\)A-Saturday分别对周一到周五判断即可。#include<bits/stdc++.h>usingnamespacestd;inlineintread(){int......
  • CF1305F Kuroni and the Punishment 题解
    一道比较简单的题,我居然调了这么久。思路看一眼这个题,发现好像没有什么思路。考虑来用一些巧妙的手法,比如随机化。首先证明一个结论,至少有一半的数只会被操作一次或者......