11-12 & 11-19 好题选讲 总结
11-12 & 11-19 好题选讲 总结
- 11-12 & 11-19 好题选讲 总结
- 11-12 Problem List
- 11-19 Problem List
- P10681 [COTS 2024] 奇偶矩阵 Tablica - 洛谷
- CF2068D Morse Code - 洛谷
- AT_agc020_f [AGC020F] Arcs on a Circle - 洛谷
- P11823 [湖北省选模拟 2025] 最后的台词 / lines - 洛谷
- CF2057G Secret Message - 洛谷
- CF618F Double Knapsack - 洛谷
- CF1610G AmShZ Wins a Bet - 洛谷
- CF1792F2 Graph Coloring (hard version) - 洛谷
- CF251E Tree and Table - 洛谷
- P6898 [ICPC 2014 WF] Metal Processing Plant - 洛谷
- P14002 [eJOI 2025] Navigation - 洛谷
- Directed Acyclic Graph - 题目 - QOJ.ac
- 因子统计 (Ex) - 题目 - QOJ.ac
- Maximum Segment Sum - 题目 - QOJ.ac
- P10440 [JOIST 2024] 环岛旅行 / Island Hopping - 洛谷
- AT_agc010_f [AGC010F] Tree Game - 洛谷
- AT_agc025_e [AGC025E] Walking on a Tree - 洛谷
- AT_agc067_d [AGC067D] Unique Matching - 洛谷
11-12 Problem List
- P10681 [COTS 2024] 奇偶矩阵 Tablica - 洛谷
- CF2068D Morse Code - 洛谷
- AT_agc020_f [AGC020F] Arcs on a Circle - 洛谷
- P11823 [湖北省选模拟 2025] 最后的台词 / lines - 洛谷
- CF2057G Secret Message - 洛谷
- CF618F Double Knapsack - 洛谷
- CF1610G AmShZ Wins a Bet - 洛谷
- CF1792F2 Graph Coloring (hard version) - 洛谷
- P9052 [PA 2021] Areny - 洛谷
- CF251E Tree and Table - 洛谷
- P6898 [ICPC 2014 WF] Metal Processing Plant - 洛谷
- P14002 [eJOI 2025] Navigation - 洛谷
- Directed Acyclic Graph - 题目 - QOJ.ac
- AT_arc188_d [ARC188D] Mirror and Order - 洛谷
11-19 Problem List
2025.11.19 XJ 好题分享 - Virtual Judge。
2025.11.19 CYEZ 好题分享 - Virtual Judge。
P10681 [COTS 2024] 奇偶矩阵 Tablica - 洛谷
枚举有和为 \(2\) 的行数、列数,注意这个枚举量是 \(O(n)\) 的,因为确定行数就能确定列数。
考虑把每列的 \(1,2\) 分配到行上,相当于有 \(m\) 种颜色的小球,一些颜色有 \(1\) 个,另一些颜色有 \(2\) 个,要把它们分配到 \(n\) 个大小不超过 \(2\) 的盒子里,还要满足同一个盒子里的球颜色不同。
不妨把 \(2\) 的行列交换到前面。然后枚举小球的排列,表示按这个排列的顺序依次分配到每个盒子。这样有如下问题:
- 有两个颜色一样的球分配到了同一个盒子。
- 同一个盒子里的两个小球交换后应该算作同一种方案。
在不存在第一个问题的情况下,第二个问题可以除以 \(2\) 的盒子个数次方。
而第一个问题可以容斥:指定这样的盒子数量,然后对方案数乘上容斥系数相加。
复杂度 \(O(n^2)\)。
CF2068D Morse Code - 洛谷
如果确定了 \(t\) 序列中的值,那么可以贪心最小化 \(\sum f_it_i\)。
考虑到点权乘深度,就相当于在到根的路径上每个点挂一个点权。
考虑自顶向下 DP,我们按深度层层 DP,每次加上挂在这一层上所有点的点权之和。
设 \(f_{i,j,k}\) 表示考虑到深度为 \(i\) 的点,当前有 \(j\) 个深度为 \(i\) 的点,\(k\) 个深度为 \(i+1\) 的点,每次可以固定一个深度为 \(i\) 的点,或者把所有深度为 \(i\) 的点向下扩展。后者转移时加上这一层点的贡献,贡献就是 \(f\) 排序后的前缀和。
倒推方案也是容易的,复杂度 \(O(n^3)\)。
AT_agc020_f [AGC020F] Arcs on a Circle - 洛谷
可以将每条线段的小数部分离散化,\(n!\) 枚举离散化后的值计算方案数,与原问题等价。
这样坐标只有 \(O(nc)\) 个,容易 DP,设 \(f(i,j,S)\) 表示考虑完左端点 \(\le i\) 的线段,当前覆盖到的最大右端点为 \(j\),集合 \(S\) 中的线段已经使用。由于我们已经确定了小数部分的顺序,因此每个 \(i\) 选的线段都固定了,转移是 \(O(1)\) 的,复杂度 \(O(2^n \times n! \times (nc)^2)\)。
P11823 [湖北省选模拟 2025] 最后的台词 / lines - 洛谷
特判答案等于 \(1\) 或 \(2\) 的情况。
考虑 \(k\) 固定怎么做,相当于做这个过程:我们称子串 \(i\) 为子串 \([i-k+1,i]\),首先将 \(x\) 初始化为子串 \(r_1\) 的最小 endpos,然后每次找到一个 \(i\ge x\),可以将 \(x\) 跳到子串 \(i\) 的最小 endpos 处,问最少跳几次可以使得 \(x\) 小于等于 \(l_2+k-1\) 的最大 endpos。
记 \(nx_x\) 表示 \(i\ge x\) 中,子串 \(i\) 的最小 endpos 的最小值,对 \(nx\) 建倍增即可解决 \(k\) 固定的问题。
考虑 \(k\) 不固定怎么做,考虑从大到小扫描 \(k\),这样要维护若干 endpos 集合合并的操作,记 \(l,r\) 分别表示 endpos 中的最小最大值,则两个 endpos 集合 \((l_i,r_i),(l_j,r_j)\) 合并的影响就是将区间 \([\min(l_i,l_j),\max(r_i,r_j)]\) 中的 \(nx\) 对 \(\min(l_i,l_j)\) ckmin。
考虑弹飞绵羊的分块,对整块 ckmin 打上标记,对散块 ckmin 就暴力修改,每个点维护第一跳出当前块后的位置和所需步数。由于整块被 ckmin 的值一定在块外,因此被标记的信息很容易,一定是一步跳出去。
而维护 endpos 的合并可以在后缀数组上用并查集合并相邻两个。复杂度是 \(O((n+m)\sqrt n)\)。
CF2057G Secret Message - 洛谷
每个染黑都覆盖一个十字,容易有一种走马步的密铺方法。
此时如果有一个染黑的位置不可被选择,那么给这个位置所有相邻的空单元格都染黑。
我们在所有五种密铺方案中都执行上述策略,取最小值即可,可以证明此时一定满足 \(\frac 15 (s+p)\) 的限制。
CF618F Double Knapsack - 洛谷
处理出 \(a,b\) 的前缀和 \(A,B\)。
对于每个 \(0\le i \le n\),求出最大的 \(j\) 使得 \(B_j\le A_i\),这样可以得到 \(n+1\) 组 \(A_i-B_j\)。
由于 \(A_i-B_j<n\),根据鸽巢原理必定有两组 \(A_i-B_j\) 是相同的,选取这两组 \((i,j),(i',j')\),则区间 \(A[i+1,i'],B[j+1,j]\) 的和相等。
CF1610G AmShZ Wins a Bet - 洛谷
如果一次操作移除了 \(i,j\),则所有 \(i<k<j\) 都要被移除,因为假如中间还剩一些没有移除:
- 如果 \(i+1\) 是
(那么可以换成移除 \(i+1,j\)。 - 如果 \(i+1\) 是
)那么可以换成移除 \(i,i+1\),此时显然字典序不会变劣。
所以被删掉的一定是若干连续段,且连续段时合法的括号序列。
可以设 \(to_i\) 表示 \([i,to_i]\) 作为合法括号序列时 \(to_i\) 的最小值。求 \(to_i\) 可以用扫一遍维护栈。
考虑从后往前 DP,设 \(f_i\) 表示考虑完移除的区间在 \([i,n]\) 内后字典序最小的串,有转移:
考虑快速比较两个字符串的字典序,在树形关系上建倍增,二分出前缀相等的 hash 值即可。
复杂度 \(O(n\log n)\)。
CF1792F2 Graph Coloring (hard version) - 洛谷
设 \(f_i\) 表示 \(i\) 个点的满足条件的且 \(1\) 号点为红色的图数量。
转移枚举 \(1\) 号点的红色连通块大小,写出转移式子(只剩一个点就无所谓蓝色或红色了):
复杂度 \(O(n^2)\),开优化即可通过。
CF251E Tree and Table - 洛谷
以一个三度点为根定向,尝试把它放在网格图中,枚举其每个儿子放的位置,转化为求两个函数 \(F(x),G(x,y)\),\(F(x)\) 表示一个空网格图中 \(x\) 放在左上角,要将 \(x\) 子树放进网格图中的方案数;\(G(x,y)\) 则表示将 \(x,y\) 同时放在网格图中的左边一列的方案数。
转移比较多分讨,记忆化 \(F(x)\) 后即可做到 \(O(n)\)(\(G(x,y)\) 不用记忆因为其只有一个后继)。
P6898 [ICPC 2014 WF] Metal Processing Plant - 洛谷
枚举 \(D(A)\),二分 \(D(B)\),用 2-SAT 判定可以做到 \(O(n^4\log n)\),用双指针可以做到 \(O(n^4)\)。
考虑从大到小枚举 \(A\) 中的最大边,每次插入这条边:
- 如果构成了奇环,那么合法的染色只有这条边两端点颜色相同,其他边黑白交替。此时之后的 \(D(A)\) 都是不合法的。
- 如果构成了偶环,由于两端点要同色,所以此时没有合法的染色方案。
- 不属于以上两种情况的次数为 \(O(n)\)。
因此只有 \(O(n)\) 个有效的 \(D(A)\),复杂度 \(O(n^3\log n)\)。
P14002 [eJOI 2025] Navigation - 洛谷
树的情况:用 \(1\) 标识父亲,用 \(2\) 标识走完的子树。每次有 \(0\) 就走 \(0\),并把当前点标记为 \(1\);否则走 \(1\),并把当前点标记为 \(2\)。
考虑有环的情况,此时会陷入有两个邻点有 \(1\) 的情况,由于原图是仙人掌,所以有恰好一个邻点有恰好一个邻居为 \(1\),另一个邻点有大于 \(1\) 个邻居为 \(1\)。此时将当前点标记为 \(3\),表示我们要依次 check 这两个为 \(1\) 的邻点,找到这个邻点时就回到 \(3\) 并把这个邻点赋为 \(0\),否则直接回到 \(3\)(因为题目中的邻点顺序是固定的,所以我们可以依次考虑这两个邻点)。
次数为 \(3n\) 以内。
Directed Acyclic Graph - 题目 - QOJ.ac
可以建出一个二分图,左部点 \(i\) 只连向右部的 \([1,i-1],[i+1,K]\),这样每选择左部点 \(i\) 就会使右部点 \(i\) 不可到达,可以前缀后缀优化建图。
考虑左部右部三个分一组,\(L_1\to L_2\to L_3\),\(R_1\to R_2\to R_3\)。然后 \(L_3\) 与 \(R_1\) 之间和之前的连边一样,再连 \(L_1\to R_2,L_2\to R_3\),这样每组都有四种方案,精细实现即可刚好卡到 \(128\) 条边。
因子统计 (Ex) - 题目 - QOJ.ac
因子数量等于 \(\prod (v_p+1)\)。
对于小于等于 \(\sqrt {\max(n)}\) 的质数,容易在 \(O(\log _pn)\) 计算 \(v_p(n!)-v_p(m!)-v_p((n-m)!)\)。这部分总共是 \(O(qn/\log n)\)。
对于大于根号的质数,指数最多为 \(1\),因此此时其次数等于 \(n/p -m/p-(n-m)/p\in \{0,1\}\)(均向下取整),可以对于每个 \(n\) 预处理 \(\sum _{p>\sqrt {\max{n}}} n/p\)。这部分是 \(O(n)\)。
Maximum Segment Sum - 题目 - QOJ.ac
求最大子段和相当于维护一个变量 \(x\),每次 \(x\gets \max(0,x+a_i)\),过程中 \(x\) 的最大值就是最大子段和。
考虑格路计数,计算最大子段和 \(\le k\) 的方案数,相当于不能碰到 \(y=k+1\)。对 \(0\) 取 \(\max\) 有点难,考虑对 \(-\frac 12\) 反射,这样越过 \(-\frac 12\) 就相当于对于 \(0\) 取 \(\max\),直接反射容斥即可做到调和级数。
P10440 [JOIST 2024] 环岛旅行 / Island Hopping - 洛谷
可以对 \(1\) 花 \(n\) 次代价问出拓扑序(更准确来说是 BFS 序),考虑问出每个点的父亲。
按与 \(1\) 从近到远依次考虑,对于每个点一直问直到找到一个拓扑序在其之前的点,这个点就是父亲。可以做到 \(3n\) 次。
可以充分利用每个点问出的信息,问出的不是父亲的点一定都是它的儿子,这些儿子在将来可以不用再询问。可以做到 \(2n\) 次。
AT_agc010_f [AGC010F] Tree Game - 洛谷
可以设 DP \(f_i\) 表示 \(i\) 子树内从 \(i\) 开始先手是否必胜。
如果一个儿子 \(v\) 是先手必胜,那么走进去就输了。
所以考虑一个先手必败的儿子 \(v\),走进去以后就会反复横跳,此时获胜的条件就是 \(a_i>a_v\)。
因此充要就是存在一个先手必败的儿子 \(v\) 同时满足 \(a_i>a_v\)。
AT_agc025_e [AGC025E] Walking on a Tree - 洛谷
首先答案的上界 \(\sum \min(d_i,2)\),而我们一定可以取到这个上界。
可以在新图上对所有 \(u,v\) 连边,如果存在欧拉回路,那么可以跑欧拉回路给每条路径定向。
若一个点的度数不为偶数,那么就向其父亲连一条边,连到最后根节点也一定满足度数为偶数,再跑欧拉回路即可。复杂度 \(O(n)\)。
AT_agc067_d [AGC067D] Unique Matching - 洛谷
不妨令最终 \(p_i=i\),最后乘上 \(n!\) 即可。
\(i\) 向 \([l_i,r_i]\backslash i\) 连边,那么充要就是最终形成 DAG。
考虑每次取出 0 度点 DP,设 \(f_i\) 表示 \(i\) 个点的 DAG 数,列出 \(f_i\) 的组成(枚举 \(0\) 度点位置 \(v_i\)):
可以设 \(g_i\) 表示 \(i\) 个点且第 \(i\) 个点为 0 度点的 DAG 数,复杂度 \(O(n^2)\)。

浙公网安备 33010602011771号