Loading

【题解】AtCoder Beginner Contest 247 补题记录

AtCoder Beginner Contest 247

A Move Right

题意

给出一个长度为 \(4\) 且由 01 组成的序列。现在将除最后一位外每个位置上的字符右移一位。求最终得到的序列(第一位视作 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. 选择边 \((1, m)\)。此时将除 \((1, m)\) 外的边依次标号为 \(1, m - 1\),显然标号相邻的边至少要选择一条。方案总数为 \(F(m - 1)\)
    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)\)

\[\begin{aligned} G(m - 2) &= F(m - 3) + F(m - 5) \\ G(m - 1) &= F(m - 2) + F(m - 4) \\ G(m) &= F(m - 1) + F(m - 3) \end{aligned} \]

又有

\[\begin{aligned} F(m - 1) = F(m - 2) + F(m - 3) \\ F(m - 3) = F(m - 4) + F(m - 5) \end{aligned} \]

所以 \(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(能过)

posted @ 2022-04-11 12:40  kymru  阅读(108)  评论(0编辑  收藏  举报