1 月做题记录
1.1-1.5
AT_agc026_e [AGC026E] Synchronized Subsequence
似乎是 dp 时一对一对考虑,且直接维护串
AT_abc349_f [ABC349F] Subsequence LCM
直接考虑每个 \(p^c\),然后子集反演即可。
AT_abc345_e [ABC345E] Colorful Subsequence
似乎就是 \(f_{i,j}\) 表示考虑了前 \(i\) 个保留 \(j\) 个的情况。
AT_agc021_d [AGC021D] Reversed LCS
LCS(T,T') 就是 \(T\) 最长回文子序列长度,区间 dp 即可。
AT_arc175_d [ARC175D] LIS on Tree 2
考虑最大最小值,然后考虑背包选择一些数,构造比较简单。
P4577 [FJOI2018] 领导集团问题
考虑维护 dp 的差分数组,发现合并直接启发式合并即可。
P5576 [CmdOI2019] 口头禅
广义 SAM 上每个串后缀对应并的链长和是 \(O(L\sqrt L)\),所以对于每个等价类暴力维护对于每个 \(l\) 的贡献即可。
AT_agc055_c [AGC055C] Weird LIS
这个题感觉十分困难啊,枚举序列权值是 \(k,k+1\),然后分成必须出现的数和非必经的点还有一定不经过的点,不难发现此时必须出现的把非必经点分成了若干区间,且每个区间长度 \(\ge 2\),因为需要 \(k\) 最大,每个区间放 \(2\) 即可,然后剩下部分插板计算即可。
P1393 Mivik 的标题
考虑 \(f_i\) 表示以 \(i\) 第一次结尾方案数,然后考虑是结尾的方案数减去前面出现过的方案数,首先和当前区间不交的容易计算,相交的不难发现一定是 border,枚举 border 容斥即可,复杂度 \(O(n^2)\),根据经典结论,border 可以划分成 \(O(\log n)\) 个不交等差数列,对于每个等差数列维护前缀和即可。
Gym102759G LCS 8
dp 套 dp 即可,只保留最近 \(2k\) 个位置的匹配状态即可。
1.6-1.11
AT_abc226_h [ABC226H] Random Kth Max
看到第 \(k\) 大考虑 \(\min-\max\) 容斥:
注意当 \(v\notin [L_i,R_i]\) 时,权值是 \(0\) 或者 \(1\) 而不是 \(\frac {R_i-v}{R_i-L_i}\)。
此时就是经典问题了,离散化,每一段都是一个多项式,然后可以直接暴力维护对于每一个 \(|T|\) 时的多项式,直接做是 \(O(n^4)\) 的,但是可以发现其实每次相当于删除一个多项式,然后加入一个多项式,可以退背包技巧做到 \(O(n^3)\)。
P4260 [Code+#3] 博弈论与概率统计
关于 \(n,m\) 关系分讨,枚举前缀最小值,拆一下式子发现是组合数前缀和形式,可以莫队维护。
AT_agc019_f [AGC019F] Yes or No
考虑一个神秘做法,假设 \(n\ge m\),首先我们可以一直选择 \(n\),至少有 \(n\) 的贡献,然后我们考虑当我们剩下 \(n=m\) 的情况时,我们假设我们选择 \(n\)。
- 答案是选择 \(n\),那么我们答案 \(+1\),而剩下的等价于 \(n,n-1\)。
- 答案是选择 \(m\),那么我们答案不变,但是剩下的还是 \(n,n-1\)。
所以我们发现,我们在 \(n=m\) 的时候有概率使得答案增加 \(\frac 1 2\),所以枚举所有 \(n=m\) 的点被经过次数,除以总方案数即可,不要忘了加上 \(n\)。
P3687 [ZJOI2017] 仙人掌
首先出现两个相交的环爆了,被环覆盖的边不能重复覆盖,然后剩下的边形成森林结构。
然后考虑剩下怎么做,不难发现就是选择若干不交路径的方案数,下面是人类智慧时刻:
如果我们把那些没有在任何一个环的树边看成在他与他自己的环里,那么问题就转化成了 用若干条不相交的链覆盖整颗树的方案数 。
太对了,然后这个就非常好 dp 了。
P4473 [国家集训队] 飞飞侠
可以把边代价放到堆里,这样我们每次更新一定是最小的,然后可以直接每一行维护一个并查集,暴力寻找即可,复杂度 \(O(n^3)\)。
存在 \(O(n^2\log n)\),曼哈顿转切比雪夫,然后线段树节点上维护一个并查集即可。
P2595 [ZJOI2009] 多米诺骨牌
两维都有跨过不好计算,考虑对于其中一维子集反演,然后对于剩下一维,记录 \(f_n\) 表示 \(1~n-1\),每个 \(i\) 都跨过 \(i+1\) 的方案数,然后计算是考虑所有方案,枚举第一个不合法的 \(i\),减去的方案数,似乎叫做代表元容斥,不管了,然后此时我们只需要计算一个矩形的合法放置数即可,可以轮廓线 dp,复杂度 \(O(2^nn^3)\)。
P4457 [BJOI2018] 治疗之雨
特殊矩阵消元,发现从上往下每个行只需要消 \(O(1)\) 个元,至于为啥满秩我还需要研究一下。
P3214 [HNOI2011] 卡农
直接考虑集合幂级数:
答案就是 \([x^\varnothing t^m]F\)。
考虑每个 \(T\) 位置上 FWT 后变成了什么:
然后计算 \(|S\cap T|\) 是偶数的情况。
由于 \(|T|\not= 0\) 时,\(\sum_i \binom {|T|}{2i}=\sum_{i}\binom {|T|}{2i+1}=2^{|T|-1}\)。
此时上面的式子就是 \((1+t)^{2^{n-1}-1}(1-t)^{2^{n-1}}\)。
\(|T|=0\) 时,是 \((1+t)^{2^n-1}\)。
然后 IFWT 回去,得到:
所以我们知道:
然后前面是容易计算的,后面枚举是乘上了 \(1\) 还是 \(-t\) 也很好计算,然后就做完了。
P7738 [NOI2021] 量子通信
鸽巢原理,按 \(16\) 位分组,则至少有一组相同,然后枚举每一位相同的计算即可,由于数据随机,复杂度是 \(O(\frac n{2^{16}}\times 16\times 16)\),可以通过。
P6220 [COCI2019-2020#6] Skandi
二分图最小点覆盖构造,考虑跑一组最大匹配,从左侧非匹配点开始 dfs,左边往右边走非匹配边,右边往左边走匹配边,然后去左侧未 dfs 的点和右侧 dfs 到的点即可。
个数正确和正确性都比较好证明。
P4298 [CTSC2008] 祭祀
首先等价于传递闭包后最小链不交覆盖数,网络流即可。
然后考虑第二问构造,我们求出一组最大独立集,然后取入度出度都存在的点即可,证明不困难。
第三问直接删点后跑网络流即可。
P5292 [HNOI2019] 校园旅行
首先我们考虑同颜色的点构成的连通块,如果是二分图我们只需要保留一个生成树,因为我们可以来回走,否则我们加入一个自环即可。
然后考虑两端颜色不同的边构成的连通块,此时一定是一个二分图,不难知道我们可以只保留一个生成树即可,因为可以反复横跳。
此时我们边数变成了 \(O(n)\),直接 bfs 合法状态即可。
CF600F Edge coloring of bipartite graph
二分图边染色,增量考虑,假设现在在考虑 \(u,v\),对于每个点维护连接其边权颜色的 \(mex\),记为 \(c1,c2\)。
\(c1=c2\) 就直接染色即可。
否则我们考虑令 \((u,v)=c1\),那么我们考虑有可能存在 \((v,w)=c1\),我们拿 \(c2\) 代替之,可能又存在 \((w,x)=c2\),拿 \(c1\) 代替之,由于不存在奇环,所以我们可以证明这样染色不存在环,所以复杂度是 \(O(mn)\) 的。
P10062 [SNOI2024] 拉丁方
考虑 \(R=n\) 的情况,发现剩下的就是一个匹配问题,具体方案就是二分图边染色,套用上题做法即可。
考虑 \(R<n\) 怎么办,考虑先确定前 \(C\) 列,同样的把可以赋值的部分连边,此时如果有数度数超过 \(R-n\) 就爆了,否则也是一个二分图边染色。
CF1336F Journey
分讨 lca,首先一定有祖孙关系,所以我们分讨是否相等即可。
- 两者不等,可以 dfs 一遍维护即可。
- 否则我们拆一下式子,发现是形如 \(dep_{lca(s1,s2)}+dep_{lca(t1,t2)}\ge A\) 的形式,不难发现可以 dsu on tree 枚举一个 lca,然后每次加点剩下可以匹配的是一个子树,这个子树可以倍增找到。
复杂度 \(O(n\log^2 n)\)。
CF343E Pumping Stations
简单题,建出最小割树,发现就是要找一个排列,试着相邻两者在树上最小值的和最大,不难想到每次考虑最小的一条边,分治下去即可。
CF232E Quick Tortoise
直接考虑分治,维护经过第 mid 行的询问,然后 bitset 维护能到当前该行的哪些位置,和从哪些位置出现能到,然后就做完了。
UOJ390 【UNR #3】百鸽笼
有一个很厉害的跟正解无关的 \(O(mn2^n)\) dp 记录一下:
考虑 \(f_{i,S}\) 表示考虑了前 \(i\) 个数,还剩下 \(S\) 内部的笼子的概率,然后考虑转移要么没有填满一个格子,转移到 \(f_{i+1,S}\),或者说填满了一个笼子,枚举该格子下标 \(j\),方案数为 \(\binom {i-1-cnt_{tot-S}}{a_j-1}\)。
但是还有个问题是选择的概率,每个人选择的概率和他加入时候的个数有关这个怎么变呢,我们发现,我们可以每次填满一个格子的时候乘上 \((\frac {|S|-1}{|S|})^{i+1}\),因为 \(\frac 1 x=\prod_{i=2}^x\frac {i-1}i\),所以每个人都计算了从他加入以来的每个 \(\frac {i-1}i\),贡献就算对了,非常牛逼。
正解是考虑猎人杀一个做法的容斥,太典了,直接 dp 是 \(O(n^6)\) 的,退背包做到 \(O(n^5)\)。
1.12-1.16
P5547 [BJ United Round #3] 三色树
无标号无根树计数题目,实际上直接 dp 子树即可,然后统计答案时以重心为根计算,减去同时存在两个中心的情况即可。
P2109 [NOI2007] 生成树计数
最小表示法表示 \([i-k,i-1]\) 的联通关系,然后跑出来只有 \(52\) 个等价关系,矩阵快速幂即可。
P4321 随机漫游
\(f_{x,S}\) 表示经过了 \(S\),目前在 \(x\),期望走多少步走完所有点,答案就是 \(f_{x,all-S}\),然后我们考虑转移,不难发现只在 \(S\) 相同的一层存在环,所以我们 \(S\) 相同的时候高斯消元即可,复杂度 \(O(n^32^n)\)。
本题同样存在 Min-Max 容斥做法可以做到相同复杂度。
P3160 [CQOI2012] 局部极小值
首先这玩意恰好不好做,考虑枚举其超集然后反演,dfs 发现状态不多,而且每个状态被钦定的关键点只有 \(c\le 8\) 个。
然后变成了钦定若干了若干个数小于周围的数,我们可以建出一个 DAG,然后在上面 dp,直接做是 \(O(2^{nm})\) 的,但是我们可以状压 \(c\) 个点有哪些被选取,然后每次加入一个点等价于新增加的数可以插入最后一段的一个后缀,枚举 dp 即可。
P10145 [WC2024] 线段树
考虑一个区间的和能够确定,当且仅当 \(L_i,R_i\) 连通,然后由于存在一条路径可以转对偶图,变成存在一组割。
然后我们直接发现两个点可以连通,当且仅当被覆盖的集合相同,这个可以哈希做。
然后我们就可以 dp 了,考虑 \(f_{x,c}\) 表示和 \(x\) 连通的颜色为 \(c\) 的方案数,\(g_x\) 表示不和任何一个叶子连通的方案数,转移简单的,可以做到 \(O(n\min(n,m))\),线段树合并即可做到 \(O(n\log n)\)。
P6029 [JSOI2010] 旅行
我们假设我们最后通过一条路径从 \(S\) 到了 \(T\)。
我们不难知道我们一定存在一个 \(i\),满足这条路径上存在全图前 \(i\) 短的路径。
我们可以枚举 \(i\),然后我们就相当于前 \(i\) 小的边可以不计入答案,最后加上即可,所以我们设 \(dis_{x,y,z}\) 表示到了 \(x\),用了 \(y\) 次前 \(i\) 小的边,和切掉了 \(z\) 条路走的最短距离,不难知道我们统计贡献时需要 \(y+z\le i\),然后就可以了。
P4007 小 Y 和恐怖的奴隶主
同样的,设 \(f_{a,b,c}\) 表示剩下 \(a,b,c\) 个血量为 \(1,2,3\) 的,同时增加一个 \(g\) 表示 boss 扣血的期望,则我们发现 \(a,b,c\) 三元组的个数只有 \(165\) 个,可以把 \(g\) 作为第 \(166\) 个,找出转移, dp 即可。
P5366 [SNOI2017] 遗失的答案
判断一些 \(L\bmod G\not= 0\) 和 \(X\bmod G\not= 0\),\(X>n\) 之类的情况。
然后 \(G\) 比较奇异搞笑,所有数都除以一个 \(G\) 即可,然后同时我们选择的数只能是 \(L\) 的因数,可以先找出来。
首先考虑没有 X 的限制,然后变成了 \([1,n]\) 里面选出若干数 \(\gcd=1,\text{lcm}=L\) 的方案数。
我们考虑把 \(L\) 分解成为 \(\prod_{i=0}^{k-1} p_i^{c_i}\),如果 \(x\) 不是 \(p_i\) 的因数,就让 \(S_x\) 的第 \(i\) 位为 \(1\),如果 \(x\) 是 \(p_i^{c_i}\) 的倍数,就让 \(S_x\) 的第 \(i+cnt\) 位为 \(1\),然后我们就需要选择若干个数满足或为全集,可以简单子集反演即可。
然后加上 \(X\) 后只需要满足容斥的时候系数加上一个 \([S_x\subset T]\) 即可,不大困难,子集反演即可。
复杂度是 \(O(w(L)4^{w(L)}+d(L)\log L+Q\log L)\)
\(Q\) 上带的的那个 \(\log\) 似乎可以去掉。
P4517 [JSOI2018] 防御网络
我们分成两个部分:割边和非割边。
割边贡献是两端大小之积
然后考虑非割边,由于原图是点仙人掌,所以是一些割边拼上若干个环,考虑计算环的贡献,首先如果只在一个节点内部就没有贡献,否则我们发现就是把选了的点赋值为 \(1\),环长度减去相邻两个值距离最大值,然后我们可以破环为链,考虑链上第一个选的点,dp 即可。
P3734 [HAOI2017] 方案数
shaber 题,dp 出来 \(F_{x,y,z}\) 表示三维的 popcount 为 \(x,y,z\) 的时候的方案数,然后直接代表元容斥即可。
P2081 [NOI2012] 迷失游乐园
考虑 dp,把环拉出来,然后设 \(down_x,up_x\) 表示往 \(x\) 子树内部走和往外的期望长度,dp 即可,复杂度 \(O(n+L^2)\)。
P10103 [GDKOI2023 提高组] 错排
首先需要 \(2m\le n\)。
我们考虑在 \([m+1,n]\) 中选择 \(m\) 个数放到 \([1,m]\) 的位置,不难知道方案数是 \(\binom {n-m}m\times m!\)。
然后我们相当于我们需要计算 \(m\) 个位置无限制,\(n-2m\) 个位置有限制的方案数,设其为 \(f_{m,n-2m}\),我们考虑如何快速计算 \(f_{i,j}\)。
对于 \(f_{i,j}\) 考虑递推,我们考虑一个有限制的数:
- 放到另外一个有限制的位置,\((j-1)f_{i+1,j-2}\)。
- 无限制的位置,\(i\times f_{i,j-1}\)。
然后我们考虑一个无限制的数:
- 对应的数就是填在当前位置,变成 \(f_{i-1,j}\)。
- 否则等价于不能填在这里,变成 \(f_{i-1,j+1}\)。
所以:
把 \(f_{i+1,j-2}\) 用第二个式子代入,得到:
所以我们知道 \(f_{i,j-1},f_{i,j-2}\) 后就可以快速得到 \(f_{i,j}\)。
然后考虑
这样我们有可以快速使 \(i+1\),不难发现也可以使 \(i,j\) 减去 \(1\)。
所以莫队即可。
P6622 [省选联考 2020 A/B 卷] 信号传递
简单题,只关心每种 \((u,v)\) 出现多少次,然后可以使用费用提前计算,直接 dp 即可。
由于卡空间,所以查询 \(val_{u,s}\) 表示 \(u\to S\) 的边权和要分成两个数组。
P4455 [CQOI2018] 社交网络
Matrix-Tree 定理板子。
P4492 [HAOI2018] 苹果树
考虑把代价转化到边上,然后边转成某个节点 \(x\) 与其父亲之间的边,枚举 \(x\) 和所在子树大小,推推式子即可。
P4494 [HAOI2018] 反色游戏
这个题还挺不错的,假设图连通。
白色为 \(0\),黑色为 \(1\)。
不难发现对一条边操作不改变总 xor 和,所以我们需要判断删了这个点后每个连通块总 xor 是否为 \(0\)。
假设都是 \(0\),然后我们就可以发现方案数是剩下的 \(2^{m+1-n}\),原因是我们只需要对于每个连通块保留一颗生成树,剩下的随便选即可。
至于怎么判断每个连通块是否 xor 和都是 \(0\),建出圆方树,对于每个点维护子树 xor 和即可。
反正细节比较多,图不连通的时候细节更多,自己可以写一下。
P4495 [HAOI2018] 奇怪的背包
裴蜀定理然后随便 dp 即可。
P5300 [GXOI/GZOI2019] 与或和
拆位,悬线法即可。
P5330 [SNOI2019] 数论
P5361 [SDOI2019] 热闹的聚会与尴尬的聚会
P6793 [SNOI2020] 字符串
建出 SAM,然后直接贪心匹配即可。
P5363 [SDOI2019] 移动金币
首先我们看成空格移动,那么不难发现,这是一个楼梯 nim 问题,然后我们就可以直接按位 dp 了。
P6630 [ZJOI2020] 传统艺能
每个节点单独考虑,然后发现可以 dp,矩阵优化转移。
P8330 [ZJOI2022] 众数
按出现次数根号分治,然后度数大的可以前缀 max 之类的,度数小的,可以考虑双指针。
P8338 [AHOI2022] 排列
P5296 [北京省选集训2019] 生成树计数
P8349 [SDOI/SXOI2022] 整数序列
P8360 [SNOI2022] 军队
P4365 [九省联考 2018] 秘密袭击 coat
P9922 [POI 2023/2024 R1] CzatBBB
CF1428G2 Lucky Numbers (Hard Version)
CF1416E Split
CF1268E Happy Cactus
CF1239E Turtle
CF1028G Guess the number
CF865E Hex Dyslexia
CF750G New Year and Binary Tree Paths
CF582E Boolean Function
CF963E Circles of Waiting
CF1110D Jongmah
1.17-1.31
P5406 [THUPC 2019] 找树
考虑随机取一个模数 \(\bmod\),然后构造集合幂级数跑矩阵树定理即可。
由于每一位是独立的,所以可以 FWT 优化。
又由于矩阵树定理是线性变换,所以我们可以集体 FWT 后,做矩阵树定理,最后 IFWT 回来即可。
P11620 [Ynoi Easy Round 2025] TEST_34
每个值有一半概率变成 \(0\),做 \(100\) 次,每次求区间 xor 和,然后得到的结果拉出来建线性基求解即可,可以证明是对的。
P6914 [ICPC 2015 WF] Tours
神秘的切边等价,等我再去学习一下。
P4425 [HNOI/AHOI2018] 转盘
拆式子,然后找支配性,变成后缀最值处的取值,单侧递归维护。
AT_abc249_g [ABC249G] Xor Cards
先把 \(x\times 2^{31}+y\),扔进去跑线性基,找到所有数,这只有 \(O(\log V)\) 个,所以 \(n\) 就降到了 \(O(\log V)\),这部分复杂度 \(O(n\log V)\)。
然后枚举 lcp,考虑 \(x\) 部分能否 xor 出来,然后剩下就是 \(y\) 部分最大,做起来很简单,复杂度 \(O(\log^3 V)\)。
然后上面的 \(O(n\log V)\) 可以优化,考虑按 B 分块,对每一块维护 \(2^B\) 种情况经过这一块会变成什么,遇到插入就重构。
会重构 \(O(\log V)\) 次,复杂度 \(O(2^B\log V+n\frac {\log V}B)\),\(2^BB=n\) 时,得到 \(O(n\frac {\log V}{\log n})\)。
P11398 众数
不错的题,考虑分块,对于每一块维护其前缀 \(cnt\) 组成的桶,以及这一块之前的众数。
这样我们每次询问,每次同时计算一个块的答案即可,复杂度 \(O((n+m)\sqrt n+k)\),不够优秀。
我们发现原因是块数过多,且每次询问多算的部分会浪费块长的时间计算一个块的答案。
我们可以从后往前按 \(1,2,4,8,\ldots\),不难发现此时浪费的部分是 \(O(k)\) 级别的,且块数只有 \(O(\log n)\) 了,这样复杂度是 \(O((n+m)\log n+k)\) 的,比较优秀。

浙公网安备 33010602011771号