11-12 & 11-19 好题选讲 总结

11-12 & 11-19 好题选讲 总结

11-12 Problem List


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]\) 内后字典序最小的串,有转移:

\[f_{i}\gets str_i+f_{i+1} \]

\[f_i\gets f_{to_i+1} \]

考虑快速比较两个字符串的字典序,在树形关系上建倍增,二分出前缀相等的 hash 值即可。

复杂度 \(O(n\log n)\)

CF1792F2 Graph Coloring (hard version) - 洛谷

\(f_i\) 表示 \(i\) 个点的满足条件的且 \(1\) 号点为红色的图数量。

转移枚举 \(1\) 号点的红色连通块大小,写出转移式子(只剩一个点就无所谓蓝色或红色了):

\[f_{i}=f_{i-1}\binom {i-1}{i-2}+\sum _{j=1}^{i-2}2f_{i-j}f_{j} \binom {i-1}{j-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\)):

\[\sum _{v} v_1\times (n-v_k+1)\times f_{v_1-1}\times f_{n-v_k}\prod _{i=1}^{k-1} (v_{i+1}-v_{i})^2f_{v_{i+1}-v_i-1} \]

可以设 \(g_i\) 表示 \(i\) 个点且第 \(i\) 个点为 0 度点的 DAG 数,复杂度 \(O(n^2)\)

posted @ 2025-11-23 19:40  dengchengyu  阅读(11)  评论(0)    收藏  举报