【题解】AtCoder Beginner Contest 247 补题记录
A Move Right
题意
给出一个长度为 \(4\) 且由 0
和 1
组成的序列。现在将除最后一位外每个位置上的字符右移一位。求最终得到的序列(第一位视作 0
)。
思路
模拟。
B Unique Nicknames
题意
有 \(n\) 个人,每个人有其名 \(s_i\) 和姓 \(t_i\)。尝试给每个人起一个昵称 \(a_i\),使得 \(\forall 1 \leq j \leq n\) 且 \(i \neq j\),\(a_i \neq s_j\) 且 \(a_i \neq t_j\)。问是否存在合法方案。
\(2 \leq n \leq 100\)
思路
模拟。
用 map
记录每个人的姓和名在所有姓名里的出现次数。显然当一个人的姓和名出现次数均大于 \(2\) 时无解。注意特判一个人的姓名相同的情况。
C 1 2 1 3 1 2 1
题意
按以下方式定义序列 \(S_n\):
-
\(S_1 = 1\)
-
\(S_n = S_{n - 1}, n, S_{n - 1}, n \geq 2\)
给定 \(n\),输出 \(S_n\)
\(1 \leq n \leq 16\)
思路
\(n \leq 16\),暴力递归模拟即可。
D Cylinder
给定 \(Q\) 个操作,对于序列 \(S\),每次操作可以:
\(1\) 在 \(S\) 末尾加入 \(c\) 个 \(x\)
\(2\) 取出 \(S\) 开头的 \(c\) 个元素,求它们的和。
数据保证对于操作 \(2\),当时序列中的元素总数大于等于 \(c\)
\(1 \leq Q \leq 2 \times 10^5\)
\(0 \leq x \leq 10^9\)
\(1 \leq c \leq 10^9\)
思路
树状数组 + 二分。
考虑将每个操作 \(1\) 视作一个元素,维护由这些元素组成的序列:
用两个树状数组分别维护序列中 \(c\) 的前缀和 \(tot\) 和 \(c \times x\) 的前缀和 \(sum\),同时用两个指针 \(s, t\) 表示当前 \(S\) 由 \([s, t]\) 中的元素组成。
对于操作 \(1\),直接更改树状数组和指针。
对于操作 \(2\),考虑在 \([s, t]\) 中二分出第一个位置 \(l\),使得 \(\sum\limits_{i = s}^l c_i \geq c\)。此时分类讨论:
-
\(\sum\limits_{i = s}^l c_i = c\),直接树状数组求和。然后 \(s = l + 1\)
-
\(\sum\limits_{i = s}^l c_i > c\),此时前 \(c\) 个元素和为 \(\sum\limits_{i = s}^{l - 1} c_i \times x_i + (c - \sum\limits_{i = s}^{l - 1} c_i) \cdot x_l\)。此时 \(c_l \leftarrow c_l - (c - \sum\limits_{i = s}^{l - 1} c_i)\),相应地需要修改树状数组。
树状数组复杂度 \(O(\log n)\),二分复杂度 \(O(\log n)\),总时间复杂度 \(O(Q \log^2 n)\)
E Max Min
题意
给定一个长度为 \(N\) 的序列 \(A\) 和两个正整数 \(X, Y\)。试求出满足 \(\forall L \leq i \leq R, \max(A_i) = X\) 且 \(\min(A_i) = Y\) 的有序正整数对 \((L, R)\) 的个数。
\(1 \leq N, A_i \leq 2 \times 10^5\)
\(1 \leq Y \leq X \leq 2 \times 10^5\)
思路
ST表 + 二分。
考虑用 ST 表维护区间最值。枚举 \(L\),用四次二分得到 \([L, N]\) 中:
-
第一个令 \(\forall L \leq i \leq l_1, \max(A_i) = X\) 的位置 \(l_1\)
-
最后一个令 \(\forall L \leq i \leq r_1, \max(A_i) = X\) 的位置 \(r_1\)
-
第一个令 \(\forall L \leq i \leq l_1, \min(A_i) = Y\) 的位置 \(l_2\)
-
最后一个令 \(\forall L \leq i \leq r_2, \min(A_i) = Y\) 的位置 \(r_2\)
显然 \([l_1, r_1]\) 和 \([l_2, r_2]\) 的交区间中,每一个下标都可以和 \(L\) 构成一对满足条件的有序数对,直接统计答案。
ST表预处理复杂度 \(O(n \log n)\),单次查询最值 \(O(1)\),二分复杂度 \(O(\log n)\),总时间复杂度 \(O(n \log n)\)
注意 \(O(n \log^2 n)\) 的线段树做法会被卡(或许是因为我常数大?)
F Cards
题意
有 \(n\) 张卡牌,第 \(i\) 张卡牌正面的数字为 \(P_i\),背面的数字为 \(Q_i\),其中 \(P_i, Q_i\) 均为 \(1\) 到 \(n\) 的排列。问有多少种方式,使得 \(1\) 到 \(n\) 中每个数字至少在一张卡牌的某一面中出现一次。
方案数对 \(998244353\) 取模。
\(1 \leq N \leq 2 \times 10^5\)
\(1 \leq P_i, Q_i \leq N\)
思路
转化。
先考虑一个前置问题:若在 \(1\) 到 \(n\) 中,两个相邻数字至少要选一个,一共有多少种方案?
考虑令 \(n\) 个数的方案总数为 \(F(n)\)。分类讨论:
-
若选 \(n\),则方案数为 \(F(n - 1)\)
-
若不选 \(n\),则必须选 \(n - 1\),方案数为 \(F(n - 2)\)
显然 \(F(1) = 1, F(2) = 3, F(n) = F(n - 1) + F(n - 2), n \geq 3\)
回到问题。不妨构造一个包含 \(n\) 个结点的图,并在 \(P_i, Q_i\) 直接连边。显然图中每个结点的度数都是 \(2\),因此这个图是由若干个环组成的。现在问题被转化成:求原图的边覆盖总数。
显然所有环都是等价的,因此考虑一个环的情况。令长度为 \(m\) 的环的边覆盖总数为 \(G(m)\)。将环的结点依次标号为 \(1\) 到 \(m\),分类讨论:
-
- 选择边 \((1, m)\)。此时将除 \((1, m)\) 外的边依次标号为 \(1, m - 1\),显然标号相邻的边至少要选择一条。方案总数为 \(F(m - 1)\)
-
- 不选择边 \((1, m)\)。此时边 \((m - 1, m)\) 和边 \((1, 2)\) 都必须被选择。同理,方案总数为 \(F(m - 3)\)
所以 \(G(m) = F(m - 1) + F(m - 3)\)
用 \(F\) 表达 \(G(m - 2), G(m - 1), G(m)\):
又有
所以 \(G(m) = G(m - 1) + G(m - 2)\)
手推可以发现 \(G(1) = 1, G(2) = 3, G(m) = G(m - 1) + G(m - 2), m \geq 3\)
最后所有环的 \(G\) 值乘积就是答案。
时间复杂度 \(O(n)\)
G Dream Team
题意
有 \(N\) 个人,第 \(i\) 个人来自第 \(A_i\) 所大学,擅长第 \(B_i\) 门学科,权值为 \(C_i\)。定义 Dream Team 为若干个人的组合,满足:
-
Dream Team 中的所有人来自不同的大学
-
Dream Team 中所有人擅长的学科不同
设 Dream Team 最多有 \(k\) 个人。试对于 \(1 \leq i \leq k\),求包含 \(i\) 个人的 Dream Team 的最大权值和。
\(1 \leq N \leq 3 \times 10^4\)
\(1 \leq A_i, B_i \leq 150\)
\(1 \leq C_i \leq 10^9\)
思路
费用流。
考虑新建两个起点 \(s1, s2\) 和汇点 \(t\),将每所大学和每个学科分别视作一个结点。
在 \(A_i, B_i\) 之间连接一条容量为 \(1\),费用为 \(C_i\) 的边。
在 \(s2, A_i\) 之间连一条容量为 \(1\),费用为 \(0\) 的边。
在 \(B_i, t\) 之间连一条容量为 \(1\),费用为 \(0\) 的边。
枚举最大人数 \(k\)。每次在 \(s1, s2\) 之间连接一条容量为 \(1\),费用为 \(0\) 的边,表示尝试增加 \(1\) 个人。如果增广的流量为 \(0\),说明此时已经得到最大人数,退出;反之,此时增广该流量的最大费用就是加入的人的权值,求前缀和即可。
显然 \(k \leq 150\),时间复杂度是 O(能过)