5 月做题记录

5.5-5.11

P5056 【模板】插头 DP

板子,但是插头 dp 由于存在不交或者包含的性质,所以状态数是 \(O(3^n)\) 的,好写做法是直接等价类划分一下。

P10215 [CTS2024] 字符串游戏

首先反转,然后直接 dp,设 \(occ(j,i)\) 表示 \(s_{j\ldots i}\)\(s[1\ldots i]\) 中的出现次数,则 \(f_i=\max_{j<i} (occ(j+1,i)-f_j)\)

由于我们知道,对于 \(k<j,occ(k,i)\le occ(j,i)\),所以我们只需要维护 \(f_j\) 递增的单调栈,但是这样还是 \(O(n^2)\) 的,怎么办呢。

首先我们按栈顶 \(j\) 计算 \(j\) 转移过来的答案,如果 \(f_i\le f_j\),就弹栈,然后不断计算,可以证明如果不能弹栈,当前就是最优的。

因为对于栈中元素 \(k\)\(f_i>f_j\ge w(k+1,j)-f_k\ge w(k+1,i)-f_k\),所以转移一定不优。

这样我们计算次数只有 \(O(n)\),然后 SAM 计算 \(occ\) 即可。

P11832 [省选联考 2025] 图排列

首先考虑树,发现非祖孙关系的每个子树不交,然后直接贪。

对于图,考虑仙人掌,发现环是顺序或者逆序定向。

然后每个点双单独考虑,发现杏仁无解,杏仁不存在哈密尔顿环,我们可以猜测有解的都存在哈密尔顿环,然后我们需要在上面顺序或者逆序考虑,再推一下发现点双形如一个环有若干不交的弦,然后找哈密尔顿环发现 K4 无解,所以可以不断缩二度点考虑。

P3706 [SDOI2017] 硬币游戏

PGF 推导一下,列出 \(n+1\) 个方程,然后跑高斯消元。

P3735 [HAOI2017] 字符串

发现形如 lcs+lcp+k>=m,建出 ac 自动机,枚举 lcs,然后挂在对应节点上,然后计算 lcp>=v 的数量,由于直接计算会重,所以需要减一下。

P6791 [SNOI2020] 取石子

先让 \(n-1\),因为可以留下一个,然后转化成斐波拉契博弈,然后先手必胜等价于不是斐波拉契数。

证明考虑 \(fib_{i+1}<2fib_i<fib_{i+2}\)\(\frac 4 3fib_i<fib_{i+1}\)

然后一个定理是任意正整数可以被拆分为若干个不连续的斐波拉契数之和。

这个证明简单。

然后现在有第一个不能超过 \(k\) 的限制,发现等价于不是斐波拉契数的时候,如果划分出来的斐波拉契数,第一个 \(>k\) 也是必败的。

然后我们就可以根据上面的定理数位 dp 了。

P8350 [SDOI/SXOI2022] 进制转换

对于 \(3\) 进制位数位 dp,然后设 \(f_{i,j,0/1}\) 表示确定 \(2\) 进制为的后面部分是 \(j\) 的时候,对于这一位有无进位的答案。

然后状态数只有 \(O(\sqrt n)\),大概和最大独立集的爆搜是 \(O(2^{\frac n 2})\) 差不多。

P9249 [集训队互测 2018] 完美的旅行

先钦定为子集,然后容斥,钦定的部分计算可以直接矩阵光速幂,要用向量乘矩阵,是 \(O(m^2)\) 的。

P10001 [集训队互测 2023] 优惠购物

很好的贪心题,每个数分成三个部分,取 \(b_i\mod c\),若干次整 \(c\),一次 \([0,c-1]\)

第一部分直接贪心,第二部分贪心从后往前,第三部分,每个位置有上限,然后直接对于 \(c-1\)\(0\) 扫描线,然后从后往前做,如果做不了就留到下个部分即可。

P11736 [集训队互测 2015] 胡策的小树

考虑确定了 \(p\),设 \(f_x\) 表示在 \(x\) 的概率,由于时间很大,所以每个子树内部 \(f\) 和不变,然后推推式子即可。

\(p\) 不确定,枚举哪个点是 \(0\),由于是排列,每个点恰好一次,然后就可以计算这个子树的答案,由于随机数据,所以复杂度 \(O(n\log n)\)

CF1768F Wonderful Jump

首先,一定操作的区间有一端是区间最小值。

然后对于一个 \(a_i\),他作为最小值是跳的步长不会超过 \(\frac n {a_i}\),原因是 \(nd\ge a_id^2\),然后我们暴力做就是对的,对于 \(a>\sqrt n\) 的,跳 \(O(\sqrt n)\) 步,小于的只有 \(O(\sqrt n)\) 个数,一种数作为区间最小值的长度和不超过 \(O(n)\)

CF1023G Pisces

好困难的题,首先不难转化到 DAG 最小链覆盖,等价于最小反链。

然后有个结论是,存在一个时间 \(T\),满足对于根节点,所有选择的 \((x,t)\)\(dis(rt,x)>|T-t|\)

充分性容易说明,必要性呃呃,反正大概就是这样。

然后我们就可以维护 \(f_{x,T}\) 表示子树内部 \(T\) 的转移的最优答案,然后转移发现是类似 slope trick 的情况,然后还有区间加。

维护差分数组,然后转移的时候,正数打 \(+tag\),负数 \(-tag\),然后如果相交就合并一下,用堆维护是否会相交。

AT_wtf22_day2_d Cat Jumps

\(A\) 排序。

首先变成钦定有多少前缀为 \(0\),然后 \(A_i\) 先看成不同的,最后除以多重组合数即可。

然后对于一个前缀为 \(0\) 的部分,方案数是 \(\prod_{i=0}^{c-1}(S+i)\)

所以我们可以使得 \(i\to j\) 连边,权值是 \(A_j+[i>j]\)

这样一个点所有连边和就是 \(S+i-1\),然后每个连通块变成每个点选出边的积的和。

所以现在要计算钦定形成 \(k\) 个连通块的权值,乘上二类斯特林数变成上面需要计算的。

我们考虑选出 \(k\) 个环,然后剩下的随便连。

由于我们发现,我们把环上边权变成 \((A_j+1)-[i<j]\),这样变成了若干条编号递增的链(这里不要求极长),链首是 \(A_j+1\),剩下是 \(-1\),然后我们把链形成 \(k\) 个圆排列,这里乘上第一类斯特林数。

然后按链 dp 即可,记录链的数量 \(j\),环外的是 \(\sum A+i-1\),环内的是成为链首 \(A_i+1\),接在后面 \(-j\),然后直接 dp。

然后链按第一类斯特林数 merge 成为环。

这个是钦定的数量,所以二项式反演一下。

然后对于出现的环,我们可以多个合并在一起,乘上第二类斯特林数。

最后再二项式反演一下。

下面的题目都是口胡,没有代码,可能有问题

P3783 [SDOI2017] 天才黑客

建虚树,然后按 dfn 序前后缀优化建图。

P5360 [SDOI2019] 世界地图

似乎直接按行维护线段树,然后 pushup 的时候 Kruskal 重构树就行了?

CF1396E Distance Matching

似乎是经典的选重心为根,然后瞎贪心即可。

P8362 [SNOI2022] 数位

对于 \(S=\sum a\),答案是个关于 \(S\)\(k-1\) 次多项式,所以我们数位 dp \(S\),同时保存所有 \(S^i\) 的和,然后转移似乎暴力二项式定理和并,最后多项式求出来也是简单的,然后做完了。

P10016 [集训队互测 2023] 虹

注意到 $ 19901991^2 \bmod 20242024 =1$,然后我们只需要求 \(z_{\gcd(i,u)}\equiv w_i\equiv 1\) 的数量。

然后修改,我们对于 \([l,r]\),需要找到到根路径构成的虚树,考虑 \(O(\sqrt n)\) 分块,然后维护前后缀和,预处理任意两个块之间的答案,由于数据随机,所以是 \(O(n\sqrt n+\frac {n^2}w)\) 的。

然后对于求 \(z_{\gcd(i,u)}\),这个是爆搜 \(u\),然后每次加入一个质因子,动态维护 \(\gcd(u,i)\),如果 添加了 \(p\),之后 \(p\) 指数是 \(c\),那么所有 \(p^c\) 的倍数都要修改一下,然后 \(n=8\times 10^4\) 的时候,修改次数只有 \(43474197\),可以接受。

5.12-5.18

P9312 [EGOI 2021] Lanterns / 灯笼

dp,然后考虑均摊优化转移。

P9988 [Ynoi2079] 2stmo

双子树莫队,先 top cluster 分块一下,然后每个询问就挂在子树内部最大的关键点上,之后每个块到询问的转移是简单的,然后考虑怎么进行块到块的转移,对于关键点 \((u,v)\),从 \((son_u,v)\)\((u,son_v)\) 中代价更小的转移过来,可以证明复杂度是 \(O((n+m)\sqrt n)\) 的。

这个甚至是不删莫队/yiw,真是神奇。

然后如果按 \(B\) 分块的话,那么复杂度是 \(O(\frac {n^2}B+mB)\),所以取 \(B=O(\frac n{\sqrt m})\) 还是 \(O(n\sqrt m)\) 的。

然后不增莫队大概就是把 \(1\) 设为关键点,然后从 \((1,1)\) 转移?

P8375 [APIO2022] 游戏

很牛的题目,考虑分治,对于每个点维护能到他的和他能到的构成的区间。

和如果一个区间会导致另外一个区间缩一半,那么才操作,复杂度 \(O((n+m)\log k)\).

CF2018F3 Speedbreaker Counting (Hard Version)

考虑怎么计算是否存在合法方案,从 \([l=1,r=n]\) 开始,然后从左往右,如果 \(r-l+1\le a_l\),那么 \(l\gets l+1\),右边同理,如果都无法移动了,那么无解。

但是这个只能判断是否存在合法方案,但是我们知道,如果我们现在有 \([l,r]\),需要判断 \(l\) 是否合法,就可以直接判断对于所有的 \(i\) 是否有 \(i-l+1\le a_i\),即 \(\max(i-a_i)\le l-1\)

这样的话,我们可以知道,如果存在合法方案,那么是一个区间。

既然是区间,那么我们可以对于极长区间容斥,考虑 \(g_i\) 表示钦定长度为 \(i\) 的区间合法,那么 \(g_i=\sum_{j\ge i}(j-i+1)ans_i\),然后这个反演是 \(O(n)\) 的。

我们考虑怎么计算 \(g_i\),首先我们需要这个大小为 \(i\) 的区间合法,那么满足 \(a_j\ge i-\min(j-1,i-j)\),然后我们考虑往两端扩展,方案数为能增左边+能增右边-两端都能增加的方案数,既 \(dp_i=2(n-i+1)dp_{i-1}-(n-i+1)^2dp_{i-1}\),然后答案就是 \(dp_n\),转置一下做到 \(O(n)\)

CF983D Arkady and Rectangles

扫描线,然后维护最大的没有被看到的位置,和区间最小位置,然后随便维护一下。

5.19-5.25

P12059 [THUPC 2025 决赛] I'm Here

首先我们只需要考虑后缀 max 位置是否合法即可。

然后如果是后缀最大值,那么不能选择其子树内的点,可以直接枚举位置转移。

否则枚举子树,直接转移。

P11427 [清华集训 2024] 绝顶之战

首先如果确定选了子集是什么可以枚举全排列然后建笛卡尔树 dp,所以我们直接对于笛卡尔树 dp 即可。

P11346 [KTSC 2023 R2] 会议室 2

考虑每个连通块分开考虑,然后加入不好做变成删除,把选区间看成拓扑序计数,然后就和 P9312 类似,但是求的是和而不是 max,可以二位前缀和维护。

CF1365G Secure Password

有点魔怔,一个做法是对于每个二进制位,维护这一位为 \(0/1\) 的数的或,但是这样需要 \(20\) 次,另外一个做法是发现 \(\binom {13}6\ge n\),所以我们划分 \(13\) 个位,每个数分配一个有 \(6\)\(1\) 的标号,对每一位,计算这一位是 \(1\) 的数的或,然后由于任意两个之间,至少存在 \(1\) 位满足询问位为 \(0\),另一个数为 \(1\),然后就做完了。

CF1179E Alesya and Discrete Math

似乎就是分治,然后每层套用期望 \(O(n)\) nth_element 做法。

CF2101F Shoo Shatters the Sunshine

考虑对于红色,找直径中点计算信息,然后加上一个蓝到该位置最大值的即可。

枚举直径中点,然后 dp。

CF1895G Two Characters, Two Colors

建出最小割模型,然后最小割=最大流,考虑计算最大流即可。

发现可以简单平衡树维护。

CF1556G Gates to Another World

考虑时光倒流,变成加区间维护可达性。

考虑放在线段树上考虑,每次考虑线段树的一个节点,把这个节点作为二进制有差异的位置,然后左右两个子树连边即可,复杂度是 \(O(n^2m)\) 的。

[ARC070F] HonestOrUnkind

考虑如果 \(B\ge A\),则无解。

如果我们知道一个人是诚实的,那么询问 \(n-1\) 次可以解决。

然后我们考虑如何找到一个诚实的人。

考虑维护一个栈,每次加入一个人就让栈顶询问这个人。

如果诚实,那么这个人不劣于栈顶,放进栈里。

如果不诚实,这两个人至少有一个坏的,都排除掉,因为 \(A>B\),所以最后的栈顶就是一个诚实的人,然后做完了。

下面的题目都是口胡,没有代码,可能有问题

P6782 [Ynoi2008] rplexq

如果儿子度数 \(\le O(\sqrt n)\),暴力拆询问。

否则我们发现我们就直接把 \(x\) 子树内的点拉出来,跑莫队,但是复杂度是 \(O(\sum n\sqrt m)\) 的,无法接受。

但是你把前 \(B\) 大子树的拉出来,用第一种方法,剩下跑莫队,复杂度就对了,非常神秘。

CF1896G Pepe Racing

分块,每块维护最大值,然后询问所有块之间最大值即可,剩下 \(2n-1\) 个数要特殊处理一下。

CF1033E Hidden Bipartite Graph

按图分层,然后剩下的似乎就直接跑整体二分。

然后对于找奇环,也是每个点对上一层整体二分一下。

CF1129E Legendary Tree

想成对儿子找父亲了,实际上是对父亲找每个儿子,然后也是用上个题做法。

CF1286C2 Madhouse (Hard version)

首先对于询问区间 \([l,r]\),可以对于每个 \(a+b=l+r\),知道 \(s_a\)\(s_b\) 是哪两个字符。

然后按这个方法,就可以推出每个字符是什么。

CF1557E Assiut Chess

一个做法是维护所有可能成为答案的位置,然后一行一行跑。

神秘做法是随机移动 \(20\) 次,然后剩下位置就很少了。

CF1562F Tubular Bells

如果我们知道一个 \(>\frac r 2\) 的质数,然后做法就很简单了。

然后我们考虑,如何得知一个数 \(a_x\),选 \(20\) 个数 \(y\),求所有 \(\text{lcm}(a_x,a_y)\)\(\gcd\) 即可。

然后我们随机 \(250\) 个数,有很大机率找到一个 \(>\frac r 2\) 的质数。

但是如果我们的 \(n\) 很小,那么可能不存在这样的质数,则我们 \(O(n^2)\) 询问所有的 \(\text{lcm}(a_x,a_y)\),最大的就是 \(n(n-1)\),然后就做完了。

P6900 [ICPC 2014 WF] Sensor Network

枚举最长产生于哪两个点,然后转补图,最大独立集,发现是二分图,结束了。

P3220 [HNOI2012] 与非

魔怔事情是我们可以表示出其他任何位运算。

所以我们只有每一位都相同的二进制位是一个答案,然后就可以直接数位 dp 了。

P3513 [POI 2011] KON-Conspiracy

考虑先跑出一个 2SAT 方案,然后发现,不可能同时存在一个集合内的两个点去另外一个集合,枚举每个集合移动了哪个点,预处理后可以 \(O(1)\) 计算是否合法。

P4142 洞穴遇险

首先网格本身就是一个二分图,然后发现黑点的横坐标是偶数还是奇数又可以分成一个二分图,然后网络流即可。

P4795 [BalticOI 2018] 基因工程

对于每个串计算与他不同的情况有多少种,记为 \(x\),判断 \(n\) 是否等于 \(k\times (n-1)\) 即可。

但是可能这个 \(x\) 不是均分的,所以随机赋值哈希即可。

P8156 「PMOI-5」奇怪的方程

考虑网格图,可以随意定权值的横纵坐标连边,然后变成那个经典的选生成树从下往上贪心的问题。

CF1685E The Ultimate LIS Problem

考虑 Dilworth 定理,分成 \([2,2,2,2,\ldots 3]\) 的下降段,可以想到把 \([n+2,2n+1]\)\([1,n]\) 匹配,然后尝试插入 \(n+1\),或者把 \(x>y\)\(y\) 接到 \(x\) 后面,\(n+1\)\(y+n+1\) 匹配,分讨之后 ds 维护几种情况即可。

P6663 [POI 2019] Układ scalony / 集成电路

似乎是简单构造,找到最大和最小两种情况,然后随便让路线拐一下增加即可。

5.26-6.1

P12080 [OOI 2025] Order Statistics

发现这个有一条线满足单调性,可以二分线段树维护,细节很多,打分提。

P7470 [NOI Online 2021 提高组] 岛屿探险

首先分成 \(\le b_i\)\(\le d_j\),两者都会的话直接 cdq 分治一下。

P6261 [ICPC 2019 WF] Traffic Blights

如果周期两两互质,答案计算简单,则找一个 V,每个路灯周期就是 \(\frac {r_i+g_i}{\gcd(r_i+g_i,V)}\),取 \(V=2^6\times 3^4\times 5^2\times 7^2\),则所有周期互质,但是无法通过。

发现如果周期之间呈倍数关系可以直接合并,则我们考虑让每个周期都是 \(p^k\) 即可,取 \(V=2520\) 即可。

P7320 「PMOI-4」可怜的团主

找出一颗 DFS 树,则叶子节点之间无连边,然后判断叶子个数即可。

P12446 [COTS 2025] 答好位 / Vrsta

考虑找到最大值,然后递归下去这个区间,然后我们可以两次询问找到两个子区间最大值,递归下去,找第一个最大值可以二分,然后就是 \(2n+\log n\) 的。

P12417 基础构造练习题 1

很魔怔的题,考虑手玩,由于有 \(n\) 个值太魔怔了,而且是两端都乘,所以考虑让权值数量 /2,然后操作。

P6019 [Ynoi2010] Brodal queue

颜色端均摊一下,然后注意 \(f_{i,j}\) 是第 \(i\) 块和第 \(j\) 块的贡献即可。

P10684 [COTS 2024] 分割 Segregacija

贪心证明一下,是第二行最后的 \(0\) 代替第一行最前面的 \(1\),然后拆式子维护。

P11585 [KTSC 2022 R1] 直方图

建笛卡尔树,分讨,发现笛卡尔树不用建出来,维护最大区间即可,然后发现贡献有支配性,可以直接李超树而不用合并。

P10717 【MX-X1-T5】「KDOI-05」简单的树上问题

分成几种情况,子树内部无的,子树有的,钦定外部是否有。

然后暴力是 \(O(8^k)\) 的,发现把 \(3\) 的转移用前缀和优化掉就是 \(O(6^k)\) 的。

P7882 [Ynoi2006] rsrams

可能成为绝对众数的区间总长度是 \(O(n)\) 的,然后区间数量是 \(O(\sum c^2)\),然后根号分治一下,大的跑莫队,小的扫描线,由于要保证 \(O(n)\) 空间,所以需要对于扫描线的区间逐块处理。

P9337 [Ynoi2001] 冷たい部屋、一人

差不多的,在值域上莫队和扫描线即可,被卡常了。

CF1290D Coffee Varieties (hard version)

\(k\) 分块,然后转有向完全图找出最少简单路径覆盖,这个直接跑 zig-zag。

CF1916F Group Division

双极定向,两个做法。

  • 保留每个点 DFS 树子树内部深度最小返祖边,和 \(x\to fa_x\) 的边,容易知道不影响点双连通性,然后剩下的就是从叶子开始缩二度点。

还有一个做法是从 \(t\) 开始,往上方定向每一条边,然后遇到一个点,考虑定向返祖边即可。

CF1876G Clubstep

从后往前,那么对于 \(x\ge a_i\),就是 \(x\to \frac {x-a_i}2\),然后加上一个代价,发现暴力操作的总次数是 \(O(n\log V)\) 的,然后 pq + 并查集维护。

下面的题目都是口胡,没有代码,可能有问题

CF1942H Farmer John's Favorite Intern

考虑霍尔定理,然后直接 dp \(\max \sum a-b-c\) 即可,转移是简单的,发现可以直接 ddp 即可。

P12447 [COTS 2025] 砍树 / Stablo

由于这是一个三度化的树,所以我们每次对于一条边确定放到哪个连通块复杂度是对的,然后我们考虑每次从一个连通块边上拓展一个点,考虑询问和 \(1\) 距离的远近,那么排序 \(n\log n\),分治 \(n\log_{\frac 3 2} n\),总的 \(O(n\log n)\)

posted @ 2025-05-11 22:25  Nityacke  阅读(82)  评论(0)    收藏  举报