2025年10月 杭州集训记
由于神秘原因,从 10.10 开始记录模拟赛和题目。
注:
- 考虑到大片代码可能影响阅读体验,会将代码整合。
- 不会的或是待补的以 * 标注。
10.10 模拟赛
\(50+90+0+0=140\),rank 11/12。勉强逃离倒一。
目测难度:绿/蓝-绿-蓝-紫。
A 凯旋而归
给定长度为 的序列 ,对于 \(a\) 的每一个前缀 \(\{a_1,a_2,\dots,a_i\}\),求 \(\max_j\{(a_1\oplus a_2\oplus\dots\oplus a_j)+(a_{j+1}\oplus a_{j+2}\oplus\dots\oplus a_i)\}\)。其中 \(\oplus\) 为异或。
\(n\le 456789,a_i\le 10^6\)。
题外话:本题在赛时数据范围误标为了 \(a_i\le 10^9\),导致全员喜提暴力分。询问 lxl 时得到了“我不会”的回答。
令 \(s_i\) 为前缀异或和。则要求的即 \(s_j+(s_i\oplus s_j)\) 的最大值。拆位,若 \(s_i\) 该位为 \(1\),则不论 \(s_j\) 选什么都会固定产生 \(1\) 的贡献;若 \(s_i\) 该位为 \(0\),则只有 \(s_j\) 的 该位也为 \(1\) 时才会产生 \(2\) 的贡献,否则没有贡献。这里我的做法选择将 \(s_i\) 取反,记其为 \(r\),所求即 \(\max\{2\times(s_j\operatorname{and}r)\}+s_i\)。
到这里就变成了一个经典问题了,设 \(f_i\) 表示最小的 \(j\) 使得 \(i\operatorname{and}s_j=i\)。查询的时候从最高位贪心走下去就行了。
B math
给定 \(m\) 个大小分别为 \(n_i\) 的可重集,\(q\) 次询问,每次询问两个下标代表的集合 \(A,B\),求:
\[\sum_{x\in A,y\in B}[x\le y] \]\(m,\sum n_i,q\le2\times 10^5\)。
诈骗题,这里先给做法。根号分治,设阈值 \(B=\sqrt m\),若两个集合的大小同时大于等于或同时小于等于 \(B\),直接双指针扫,否则枚举小的那个集合的每个数,二分找出另一个集合有多少数满足条件。还要加上记忆化。
下面默认 \(n,q\) 同阶。
证明:双指针的复杂度是 \(O(|A|+|B|)\),对于 \(|A|,|B|\le\sqrt n\),暴力扫的复杂度不超过 \(O(n\sqrt n)\);对于 \(|A|,|B|\ge\sqrt n\),这样的集合不超过 \(\sqrt n\) 个,两两询问最多只有 \(n\) 次,总复杂度也是 \(O(n\sqrt n)\)。最后一种的复杂度就是 \(O(n\sqrt n\log n)\) 的。
综上,时间复杂度 \(O(n\sqrt n\log n)\),非常极限,刚好卡到了 \(996\operatorname{ms}\),把块长调到 \(300\) 可以到 \(900\operatorname{ms}\) 以下。
题解的一种离线做法可以做到严格单根号不带 \(\log\)。
C 生成树
给定一张联通无向图,求出所有生成树中,以 \(1\) 为根的情况下所有节点的深度之和的最大值。
\(n\le 20,m\le\frac{n\times(n-1)}{2}\)。
观察到一个重要事实,对于最优的生成树,所有非树边都是返祖边,否则可以选择横叉边,并断开一条树边(连接深度较小的点与其父亲的边),使答案不减。
考虑状压,令 \(f_{S,u}\) 表示已选集合和当前根分别为 \(S\) 和 \(u\) 时的答案。则树根的每一棵子树都是可以唯一确定的,即对应儿子的 DFS 生成树。转移如下:$$f_{S,u}=1+\max{f_{T_1,v_1}+f_{S\textbackslash T_1,u}+|T_1|-1}$$
D coffee*
???
10.11 模拟赛
\(100+100+25+5=230\),rank 6/13。目前排名最高的一次。
目测难度:绿-黄/绿-蓝-黑。
A 十二桥问题
给一张带权无向图,有 \(k\) 条关键边,求从点 \(1\) 出发,经过所有关键边最终回到 \(1\) 的最短路径。
\(n\le 5\times 10^4,m\le 2\times 10^5,k\le 12\)。
水,裸的状压。预处理最多 \(2k+1\) 个关键边的端点和 \(1\) 的最短路,直接状压即可。
时间复杂度 \(O(km\log m+k^22^k)\)。
B sequence
给定长度为 \(n\) 的序列 \(a\),初始全为 \(0\),每次修改给定参数 \(l,r,k\),对于 \(l\le i\le r\),令 \(a_i\gets a_i+\binom{i-l+k}{k}\),全部修改完后输出序列。
\(n,q\le 5\times 10^5,k\le 20\)。
诈骗题。观察到 \(k\le 20\),且不需要修改时回答询问,把每个 \(k\) 的前几项贡献打表出来就可以发现贡献就是 \(k\) 维差分。严格证明可以用递推式,这里略。
时间复杂度 \(O(nk)\),听说还可以用多项式相关做到 \(O(n\log n)\),神秘。
C ATM的最小和
一张 \(n\) 个点的完全图,点有点权 \(a_i\),两点 \(u,v\) 间的边权为 \(\max(a_u,a_v)\mod\min(a_u,a_v)\),求图的 MST。
\(n,a_i\le 5\times 10^5\)。
由于边数太大,考虑保留有限的边。先给数列去重,显然不影响答案。令连边都是从小到大连,从小到大考虑,对于每一个 \(a_i\),只考虑在 MST 中 \(i\) 对后面的连边,根据后面的 \(\left\lfloor\frac{a_j}{a_i}\right\rfloor\) 分成几个连续块,如对于 \(3,4,6,7,8,10,11\),在处理 \(3\) 时划分为 \([4],[6,7,8],[10,11]\),在连边时只需要连每个段的第一个即可,即 \(3\to 4,3\to 6,3\to 10\)。
然而,为什么我们可以省略 \(i\) 到其它位置的边?
注意到对于 \(a<b<c\) 且 \(\left\lfloor\frac{b}{a}\right\rfloor=\left\lfloor\frac{c}{a}\right\rfloor\),有 \(b\mod a+c\mod b=c\mod a\),即 \(b\to c\) 可以被等效替代(\(b\to c\) 后面也会建立)。至于等式的证明,可以画图看出,这里贴一个来自 Deepseek-V3.2 的严谨证明:
对于 \(0 < a < b < c\) 且 \(\left\lfloor \frac{b}{a} \right\rfloor = \left\lfloor \frac{c}{a} \right\rfloor\),设 \(k = \left\lfloor \frac{b}{a} \right\rfloor = \left\lfloor \frac{c}{a} \right\rfloor\),则 \(b = k a + r_b\) 和 \(c = k a + r_c\),其中 \(0 \leq r_b < a\) 和 \(0 \leq r_c < a\)。由于 \(b < c\),有 \(r_b < r_c\)。
计算 \(c \mod b\):由于 \(c < (k+1)a\) 和 \(b \geq k a\),有 \(c < b + a\)。又因为 \(a < b\),所以 \(c < 2b\),因此 \(\left\lfloor \frac{c}{b} \right\rfloor = 1\),从而 \(c \mod b = c - b\)。
代入得:\(b \mod a + c \mod b = r_b + (c - b) = r_b + (k a + r_c - k a - r_b) = r_c = c \mod a.\)
因此,等式 \(b \mod a + c \mod b = c \mod a\) 成立。
对于 \(a_i\),最多只有 \(\frac{V}{a_i}\) 个连续块(\(V\) 是值域),所以边数是调和级数复杂度 \(O(n\ln n)\)(认为 \(n,V\) 同阶)。
总时间复杂度 \(O(n\log^2n)\)。
D 练功*
???
10.12 分块杂谈
没啥好题,摆了不写了。
好多 云南OI Ynoi 大分块,与其中一题搏斗了接近 1h。
贴题单吧(做了的)。
- P2801 教主的魔法 基础分块
- P5356 [Ynoi Easy Round 2017] 由乃打扑克 比较温和的 Ynoi 分块
- P4168 [Violet] 蒲公英 预处理型分块
- P6177 Count on a tree II/【模板】树分块 树分块,只会随机撒点
- P5906 【模板】回滚莫队&不删除莫队 回滚莫队
- 一些基础莫队习题,早就做过了,省略。
10.14 模拟赛
欸今天怎么变回省选难度了 QwQ。
\(95+0+40+0=135\),rank 16/16,熟悉的垫底又回来辣!
最后 50 min 的时候才写完 T2 100 行的 DP,结果没来得及调又跑去写 T3 40 分暴力,决策有点失败,相当于 T2 白干。
目测难度:黄-蓝-绿/蓝-紫。
BCD 都是爽赤题,锻炼代码能力。
A Doctor
给定一棵树,找一条从点 \(1\) 出发的路径(可以不是简单路径),经过恰好 \(k\) 个不同点,最小化路径长度并输出方案。
\(k\le n\le 10^5\)。
签到题,选 \(1\) 到最深的点的链,不够的话加上任意子树即可。
挂分原因:在 reverse
数列的时候写了 i<=ans.size()/2-1
,当 size
为 \(1\) 时会炸成极大值。
B Patriot
给定 \(m\) 个集合 \(S_1, S_2, \dots, S_m\),计数长度为 \(n\) 的整数序列 \(a\) 的个数,使得对于任意 \(1\le a_i\le r_i\),由 \(a\) 导出的长度为 \(m\) 的序列 \(b_i=\bigoplus_{j\in S_i}a_j\) 是一个不降序列(定义空集的 \(b_i\) 为 \(0\)),其中 \(\oplus\) 表示异或运算,答案对 \(998244353\) 取模。
\(n,m\le 7,r_i\le 2^{500}-1\)。保证数据随机生成。\(2000\operatorname{ms}\)。
数位 DP 好题。仿照数位 DP 设计状态的思路,设 \(f_{i,S,T}\) 表示在第 \(i\) 位,每个 \(i\) 是否已经确定 \(b_i<b_{i+1}\),每个 \(j\) 是否已经确定 \(a_j<r_j\)。转移就枚举这一位填的数是多少,可以预处理每个数的结果,这样就做完了。
时间复杂度 \(O(n2^{3n}\log r)\),这里认为 \(n,m\) 同阶。虽然看起来到了 \(7\times 10^9\) 很悬,但在随机数据下跑到了 \(1000\operatorname{ms}\) 左右。
C 路径阻挡
给定 \(n\times m\) 的网格,某些格子上已经有了一些障碍,只能向下或向右走,求在格子上额外放置 \(T\in \{1,2\}\) 个障碍,使得左上角不能到达右下角的方案数。
\(n,m\le 5000\)。
原题 QOJ 833,IOI 2026 集训队作业。
考虑做两条路线 \(X,Y\),前者是优先向下,即最靠右下的路线,后者是优先向右,即最靠右上的路线。它们都能 DP 后简单求出。考虑它们的交,交点个数即为第一问的答案。
再考虑第二问,分为两种答案,一种是至少有一个在 \(X,Y\) 的交上的,另一种是两个都不在的。第一种很好求。下面讨论第二种答案。
显然 \(X\) 上至少要有一个障碍,考虑枚举它,在放了这个障碍的新图上,问题等价于第一问。\(Y\) 不变,但是不可能重新跑一遍 \(O(nm)\) 的 DP,考虑新的 \(X'\) 的性质。注意到在一条对角线(定义为 \(i+j\) 相等的集合)上,任何路径都会经过恰好一次。则在障碍点的这条对角线的右上部分,第一个满足条件的点就是 \(X'\) 经过的。找到这个点就可以直接找 \(X'\) 与 \(Y\) 的交了,注意不要与情况一算重。
路径长度是 \(n+m\),故时间复杂度 \(O((n+m)^2)\)。实现时建议使用多模数。
D 货币*
???