随笔分类 - 比赛总结
摘要:C. 列表 原题链接. 思路 我们考虑取数的过程: 第一次一定会取 \(a_{n + 1}\), 然后我们会在 \([1, n]\) 或 \([n + 2, 2n + 1]\) 的区间中选择一个数删除. 如果我们在 \([1, n]\) 中选一个数删除, 那么下一个数会取到 \(a_{n + 2}\
阅读全文
摘要:B. 小朋友 基础动态规划. 思路 我们令 \(f_{i, j}\) 表示枚举到第 \(i\) 个的时候一共选了 \(j\) 个小朋友的最大字符串. 那么根据第 \(i\) 位选或者不选, 我们有 \[f_{i, j} = \max(f_{i - 1, j - 1}, f_{i - 1, j}) \
阅读全文
摘要:题面 & 题解 A. 岛屿 概率期望会不了一点. 思路 假设我们最开始有 \(a\) 个「蓝蓝 / 红红」链, \(b\) 个「蓝红」链. 我们考虑对于每一个「蓝红」链向外连边. 如图, 我们将红点向外连向一条「蓝蓝」链, 由于每一个点只能最多向外连一条边, 那么它们就「合成」了一条蓝蓝链 \((
阅读全文
摘要:D. 积木 和之前容斥专题的一道题有点像. 思路 注意到虽然 \(1 \le n, m \le 50\), 但是 * 的个数不超过 12 个. 于是我们可以考虑对 * 的个数进行状压, 也就是钦定哪些 * 必须作为积木的中心 \((\)下文统称为 o\()\). 钦定完成, 我们考虑什么情况下是不合
阅读全文
摘要:B. 直线多边形 还是要多往数学方面想. 思路 由于给定了 \(n\) 个顶点, 那么就会有 \(n\) 条边. 根据初中数学知识可以知道, \(n\) 边形的内角和为 \((n - 2) \times 180 \degree\). 同时题目告诉了我们以下条件: 任意边都和 \(x\) 或 \(y\
阅读全文
摘要:题面 A. 树 思路 先说结论, 每条边的贡献次数等于其左右两侧子树大小的最小值. 证明 #include "iostream" #include "vector" using namespace std; typedef pair<int, int> pii; typedef long long
阅读全文
摘要:A. 麻将 怎么回事呢? 还是太浮躁了吗? 题面 给定 $ n $, $ m $ 和长度为 $ n $ 的序列 $ a $, 保证 $ n $ 为 3 的倍数, 且 $ a_{i} \in [1, m] $. 一个可重三元集合被称为面子, 当且仅当其为形如 $ \{x, x, x\} $ 或 $ \
阅读全文
摘要:C. 有向图 题意 初始有一张含有 \( n \) 个点的有向图, 你可以不断向其中加入至多\( n(n-1) \)条边, 不允许加入重边或者自环. 定义一个长度为 \( m \) 的序列 \( \{a_i\} \) 为一个 SCC 序列, 当且仅当存在一种加边方案, 使得加入\( i \)条边后图
阅读全文
摘要:题面 & 题解 A. 数论 题意 给定 \(n, p\), 让你求: \[\sum_{i = 1}^n \sum_{j = 1}^p \varphi(i^j) \mod 10^9 + 7 \]其中 \(n \le 10^7, p \le 10^9\). 思路 首先我们可以线性处理逆元, 并筛出 \(
阅读全文
摘要:B. 大根堆 思路 考虑倒着插入每个节点以满足大根堆的性质, 那么最开始我们只有一个位置可供插入. 如果当前插入的点不一定是叶子结点, 那么可供插入的位置就会多一个; 如果其一定是叶子结点, 那么可供插入的位置就会少一个, 乘起来即可. void init() { scanf("%d %d", &n
阅读全文
摘要:D. 博弈论 给我绕昏了. 思路 考虑什么时候会是 Draw. 可以发现若 Alice 和 Bob 手中的数相等, 那么异或和就为 0, 也就是整个序列的异或和为 0. 接下来考虑异或和不为 0 的情况. 不妨设序列异或和为 \(s\). 我们对于每一位考虑, 如果这一位上是 0, 那么在这一位上,
阅读全文
摘要:k 短路 2024.10.24 CW 模拟赛 T2, 有些古老, 单独拿出来写. 题意 给定带边权的简单有向图, 满足: 每个点至多存在于一个简单环内; 任意两点之间至多存在一条简单路径. 求起点 \(S\) 到终点 \(T\) 的 \(k\) 短路长度. 其中 \(n \le 50, 1 \le
阅读全文
摘要:D. 送快递 思路 注意到题目中说「第 \(i\) 个时刻, 青蛙和周欣中的一个人要将快递送往位置 \(k_i\), 送完快递后, 那个人将停留在位置 \(k_i\)」, 那么就有一个 \(\mathcal{O}(n^2)\) 的 DP : \(f_{i, j}\) 表示执行完前 \(i\) 次操作
阅读全文
摘要:B. 美食节 思路 令 \(f_{i, j}\) 表示第 \(i\) 个活动后在 \(j\) 的最小疲劳值. 对于每一个 \(f_{i, j}\), 先从 \(f_{i - 1, j}\) 赋值过来, 接下来由两部分贡献. 第一部分: \[f_{i, j} = f_{i - 1, j} + \beg
阅读全文
摘要:A. 怎么又是先增后减 题意 给定一个序列 \(A\), 每次操作只能交换相邻两个元素, 求使得序列 \(A\) 先增后减的最小操作次数. 思路 我们每次考虑当前未被处理的最小的 \(x\), 其一定被移动到序列的最左边或者最右边. 若它向左移动, 那么移动次数即为左边比它大的数的个数; 向右也同理
阅读全文
摘要:C. 环上合并 zcy 讲的好. 思路 先考虑一下特殊性质 \(a_i \le a_{i + 1}\). 动手模拟一下可以发现, 对于第 \(2 \sim n - 1\) 个数, 我们需要使用 \(n - (\)该数出现次数\()\) 次操作; 而对于第 1 个和第 \(n\) 个数, 则需要 \(
阅读全文
摘要:题面 & 题解 T1 题面让我们求一个排列 \(p\), 使得 \(a_i \oplus b_{p_i} = x\), 其中每一个 \(x\) 均相等, 最后升序输出每一个 \(x\). 不难发现, \(x\) 只可能是 \(a_1 \oplus b_i\). (当然, \(a_1\) 可以是序列
阅读全文
摘要:题面 & 题解 T1 原题链接 算法 树的直径, 贪心. 思路 考虑每一颗树, 它的最长链即为它的直径. 题目中输入一张图, 且保证无环, 那么可以考虑在每一颗树中求出直径. 最后将这些树拼起来即为最长链的长度. #include "iostream" using namespace std; na
阅读全文
摘要:题面 & 题解 T1 算法 概率, 期望. 思路 根据期望的线性性, 可得第 1 堆石子被取走的期望时间 \(\displaystyle E(t) = 1 + \sum_{i = 2}^n P_i\), 其中 \(P_i\) 指的是第 \(i\) 堆石子在「第 1 堆石子被取走前」取走的概率. 注意
阅读全文
摘要:题面 & 题解 T1 算法 区间 dp. 思路 int dfs(int l, int r, int x) { if (l > r) return 1; if (~f[l][r][x]) return f[l][r][x]; if (a[l] < x) return f[l][r][x] = dfs(
阅读全文