2024.9 做题记录
1.P7811 JRKSJ R2 你的名字。
不难,但是卡常 /tuu
首先对 根号分治,记阈值为 ,对序列分块,记阈值为 。
对于 的情况,可以直接枚举 ,然后转化成区间 min,这部分时间复杂度 。
对于 的部分,考虑将一个询问拆成对于每个 询问 中 的最小值,一个询问会被拆成 个。
改为从小往大加入后变成 次单点改, 次查询区间 min。
考虑先把 在同一个块内的询问暴力做,这部分时间复杂度是 的。
然后剩下的询问都能被拆成一个块的后缀 min、一个块的前缀 min、一段块的区间 min。
考虑每个块维护前后缀 min,块间维护 ST 表,这样查询是 的,修改 ST 表上只用改 个位置,是 的。
这部分总时间复杂度为 。
总时间复杂度为 ,当 , 时,时间复杂度为 。
卡常的话可以把 开大一点。
2.SPOJ2939 QTREE5 - Query on a tree V
挺简单的,直接点分树就做完了。
3.P6688 可重集
记区间 的哈希值为:,这样就能快速至于平移 了。
不难发现 ,然后就做完了。
时间复杂度 。
4.CF1801F Another n-dimensional chocolate bar
设 表示考虑了前 个,现在还要求 时要求的式子的最大值。
转移为:
我们比较习惯向下取整,所以可以改写为:
算一下状态数。考虑转移两次后,不难发现:
这也就是说,我们 DP 状态的第二位一定是 ,也就是说第二维的大小是 的。
再算一下转移的时间复杂度:
总时间复杂度 。
5.CF504E Misha and LCP on Tree
先剖一下,然后每个询问就都被拆成了 段字符串。
按 dfn 序正反建 SA,然后就能快速求出两段字符串的 LCP,双指针统计答案即可。
时间复杂度 。
6.CF914F Substrings in a String
bitset 字符串匹配。
正解是分块 SAM 支持修改,查询通过根号分治处理。
7.P1222 三角形 and P3219 HNOI2012 三角形覆盖问题
首先我们可以将 轴切成 区间,使得每个区间中只有 个梯形。
将三角形按 排序,扫描每个区间统计答案即可。
时间复杂度 。
还有一种 的做法。
首先按 排序,维护当前 轴上所有的不交的被覆盖的区间。
现在要做的就是三件事:
- 插入一个三角形。
- 删除一个三角形。
- 分裂一段区间。
可以用 set 维护。
插入的时候先把所有被它包含的删掉,然后再插入。
删除可以直接删。
分裂的话可以维护相邻两个三角形的交的大小,如果最小的为 0 就删掉原本的区间后再插入新的区间。
分析一下时间复杂度。
一个三角形最多被插入 1 次,所以插入的时间复杂度是 的。
同理,删除也是 的。
对于分裂,发现插入一个三角形最多会造成 2 次分裂,所以时间复杂度也是 的。
总时间复杂度 。
8.P5291 十二省联考 2019 希望
过了!赢!
首先的第一想法是把包括每个点的答案算出来然后相加,但这样会算重。
但是你发现,对于一组方案, 它能到达的点一定是一个连通块,我们想让它只被算一次。这个可以点边容斥 。
也就是说,我们要把每个点和每条边的答案算出来相减。
考虑 DP:记 表示选出一个在 子树内且最远点与 距离不超过 的包含 的连通块方案数, 表示选出一个在 子树内且最远点与 距离不超过 的包含 的连通块的方案数。
转移为:
然后点的贡献为 , 这条边的贡献为 。
现在的问题是优化这个东西,显然要长链剖分。
记 表示 到子树内离他最远的叶子的距离。
先考虑 。发现虽然 第二位的范围是 的,但是 这一部分的值都是相等的。
思考一下我们要支持什么操作:后缀乘,全局加,单点乘。
不难想到用带 的数据结构维护,但是我们要线性。
对于后缀乘操作,我们对前缀的每个点乘上它的逆元,然后就变成全局乘了。
对于乘 0 的情况,我们可以维护 表示 ,然后能简单维护。
现在的问题是求逆元,不难发现需要求逆元的位置只有 ,所以可以预处理后 求出所有逆元。
这样对 的转移就做到了线性。
然后考虑 。发现 的第二位只需要维护 即可转移。
考虑长儿子继承父亲的答案,短儿子暴力转移,这样就做到了 转移。
发现求 需要求 的前后缀乘积,而 的前缀乘积是 做到 这个儿子前的值,后缀乘积我们可以简单维护,所以只需要支持对 的可撤销。
具体的说,我们先在求 的时候,把在每个点对 的影响记下来。
然后在求 的时候,按照和 相反的顺序做,每次把当前儿子的影响撤销,这样 中存储的就是前缀乘积。然后将对应儿子的 的值乘到长儿子的 上,这样长儿子的 中存储的就是当前的后缀乘积。
这样我们就实现了求前后缀积,剩下的按式子转移即可。
时间复杂度 。
9.P8557 炼金术(Alchemy)
考虑将每种金属往熔炉里放,这样方案数就是 。
10.P5303 GXOI/GZOI2019 逼死强迫症
不难发现,如果固定了两个 的砖块的位置分别为 ,那么第 列的放法就固定了,第 和 列的方法是斐波那契数列。
所以答案的式子是:
如果记 ,那么有:
矩阵乘法即可。
时间复杂度 ,其中 。
11.P7706 「Wdsr-2.7」文文的摄影布置
首先观察到,因为求的是 的最大值,所以 是没用的,因为取到最大时 一定最小。
然后就可以线段树简单维护了。
时间复杂度 。
12.P6327 区间加区间 sin 和
直接线段树。
13.P5278 算术天才⑨与等差数列
判定条件是:
- 若 ,。
- 。
- 若 , 互不相等。
直接线段树维护即可。
时间复杂度 。
14.P6617 查找 Search
对每个 记 表示 ,查询就是查 的区间 。
然后发现这样修改不了。
你发现你修改不了的原因是你会影响到下一个 之间的所有满足 的数,但是这些里面只有第一个是对答案有影响的,其他的一定不优,所以把其他的 赋值为 0 即可。
时间复杂度 。
15.P4344 SHOI2015 脑洞治疗仪
区间覆盖,区间最长连续 0 子串。
16.P2572 SCOI2010 序列操作
。
17.P4146 序列终结者
。
18.P7738 NOI2021 量子通信
首先发现,由于 ,所以如果我们对每个串按 分块,那么至少有一块询问串和字典串是相同的。
由于数据随机,对于查询串的一块,字典串中与这一块相同的串的期望个数为 6.103515625。
所以暴力枚举询问串的每个块,找字典串中与他相同的判断即可。
20.P8576 「DTOI-2」星之界
不难发现,操作二的答案是:
只需维护区间和、区间每个数阶乘的乘积。
看到操作一不难想到分块,这部分是简单的。
注意每块的并查集不能对每个颜色维护,而是要对每个位置维护它与哪个位置颜色相等。如果按前一种方法维护,那么 , 之后 的颜色无法维护。
时间复杂度 。
21.P8321 『JROI-4』沈阳大街 2
相当于把 和 两两匹配,贡献为没对匹配较小的数的乘积。
所以我们把 和 拼起来,从大到小排序,在后面的数的位置计算贡献即可。
考虑 DP。设 表示前 个数,匹配了 对的贡献之和,转移为:
答案为 。
时间复杂度 。
22.P1641 SCOI2010 生成字符串
看成初始在 ,当前在 ,如果选 0 就走到 ,如果选 1 就走到 ,最后在 且纵坐标始终不小于 0 的方案数。
答案为 。
23.P3773 CTSC2017 吉夫特
先按 Lucas 定理分解一下。记 的二进制分解的第 位为 ,则有:
这就要求每个 都不等于 0,也就是说 ,也就是说如果把二进制看成集合,那么 。
考虑 DP。记 表示以 结尾的方案数,那么转移为:
可通过枚举子集做到 。
24.P8688 蓝桥杯 2019 省 A 组合数问题 and P6669 清华集训2016 组合数问题
先按 Lucas 定理分解一下 ,不妨 ,,那么有:
那么 。
存在一个不好算,改为算 。
考虑数位 DP。设 表示考虑了高 位, 贴 / 不贴上界, 贴 / 不贴上界的方案数。
转移为:
其中:
时间复杂度 。
25.P8594 「KDOI-02」一个仇的复
不难发现只有 是特殊的,因为一个 的矩形是可以竖着填的,其他的矩形都只能横着填。
所以考虑枚举 的矩形个数 ,它将整个网格分隔成了 这些较小的网格。
不难通过插板得到分隔的方案数为:
现在的问题是计算每部分的方案数。
先考虑对于一个 的网格,如果只允许横着放 个矩形,那么有多少种方法。(这个是上面的子问题)
不难通过插板法得到答案:
第一步是枚举了第一行放多少个,第三步是通过范德蒙德卷积化简。
现在再考虑原问题,答案为:
还是范德蒙德卷积。
此时,我们发现,在 相同时,对于每种 序列的答案都是一样的,所以我们只需要在求出 序列的方案数即可。
不难通过插板得到答案为:
所以答案就是上面三部分乘起来,即:
但是我们还有一种情况没有考虑到,就是 时我们可以全放 的矩形,所以真正的答案为:
时间复杂度 。
26.P8367 LNOI2022 盒
先考虑如果已经知道了 数组怎样算答案。
考虑对每个 分别计算贡献。记 ,。
则答案为:
不知道 的话可以枚举 的每一项,剩下的是插板:
然后分类讨论拆绝对值,这里只讨论 的部分,这样就转化成了求两个式子:
第二个式子的形式是显然不如第一个好的,所以考虑把 吸收进去,转成第一个,变成:
后面的那个式子调一下 和 就和第一个一样了。所以现在就只需要求第一个了,记其为 。
因为 和 都是单调的,所以考虑每次由 变成 或 。
变成 是简单的,现在主要是解决 加一时的情况。
考虑 的组合意义:有 个盒子,要放 个小球,前 个盒子中至多放 个球的方案数。
这个可以转化成第 个球恰好放在 几之后的盒子里。这样可以枚举第 个球放的位置,也是个插板:
然后 加一就能做了。时间复杂度 。
27.P4456 CQOI2018 交错序列
答案为:
然后 和 可以线性筛一下,这样就线性了。
28.P4562 JXOI2018 游戏
对于 ,如果 ,那么我们称 是一个关键点。
不难发现,对于一个排列 ,。
考虑利用 来解决。
我们要求是关键点最大位置的和,不妨先求关键点最大位置的期望。
不妨记关键点的个数为 。
对于一个非关键点,它在所有关键点之后的概率为 。
那么所有关键点之后的点数期望为:。
所以关键点最大位置的期望为:
最终答案为:
关键点的个数可以线性筛出最小质因子然后计算。
时间复杂度线性。
29.P2606 ZJOI2010 排列计数
对于 ,连边 ,这样就形成了一棵外向树,我们要求的就是树的拓扑序数量。
答案为:
注意要把每个数表示成 的形式再进行乘除运算。
时间复杂度线性。
30.P8863 「KDOI-03」构造数组
记 ,先把 的情况判掉,然后令 。
现在我们的问题是数长度为 的二元组序列 表示我们第 次操作操作了位置 的数量。
此时我们的要求是 。
不妨将第一个条件变为 ,我们最后将结果乘 即可。
考虑容斥,钦定一个集合 满足 中的二元组满足 ,此时的容斥系数为 。
现在的问题是算方案数。
考虑第二个条件,我们不妨记 表示钦定的二元组中 的数量,满足 。
那么贡献为:
其中第一个组合数是把钦定的位置分配到原序列中的方案数,第二个组合数是把未被钦定的位置分配到二元组中的方案数。
拆一下:
不难想到记:
那么答案即为:
暴力卷积可做到 ,使用分治 NTT 可做到 。
31.P3266 JLOI2015 骗我呢
首先进行简单的观察,发现每一行都是 这个序列删掉了一些数。
如果记第 行删掉了 ,那么要求是 。
考虑 DP,记 表示考虑了前 行, 的方案数。
转移为:
画一下转移的形态,发现答案等价于从 走到 ,每一步能向上或向右走,不经过 和 的方案数。
反射容斥即可。
时间复杂度 。
32.P3197 HNOI2008 越狱
。。。
33.P6692 出生点
不想写了。
34.P1450 HAOI2008 硬币购物
直接列 GF:
然后暴力卷起来就行。
时间复杂度 。
当然你可以把分子暴力展开一下,这样就是 ,其中 。
35.P8290 省选联考 2022 填树
首先考虑枚举最小值 ,那么我们剩下的能填的最大值 。
但是我们恰好取到最小值不好做,所以我们进行容斥 。
那么现在我们要求的就是值域是 的子集的方案数和权值和。
先枚举钦定的值域区间 ,记 表示 点 为根选一条链的方案数 / 点 为根的方案数, 表示 点 为根选一条链的权值和 / 点 为根的权值和。
考虑合并点 的儿子 ,记 ,,则转移为:
时间复杂度 。
发现 可以表示成关于 的至多一次的分段多项式, 可以表示成关于 的至多二次的分段多项式,每个点都会把左端点的值域分成至多 5 段,所以左端点值域总共被划分成了 段,考虑对每段分别 DP。
考虑多项式次数上限。
先考虑 。
固定一个 时, 就相当于选一条链,把链上的点的 乘起来,这个是至多 次的。
然后我们对 做了一个前缀和,这个是至多 次的。
所以 的次数不超过 。
再考虑 。
固定一个 时, 就相当于选一个点,把这个点的 乘上这个点的贡献次数,贡献次数就是分别从以这个点为根时的两棵不同的子树中选一条链,将他们的 乘起来,这个是至多 次的。
然后我们对 做了一个前缀和,这个是至多 次的。
所以 的次数不超过 。
直接拉插可以做到 。
还有一种常数更好的做法,是从第一篇题解里看到的,我实现了一下发现确实跑的飞快。
就是你考虑直接维护这个多项式,记 表示 对应的多项式, 表示 对应的多项式,转移和上面的一样,时间复杂度就是树形背包的 。
现在要做的就是已知 ,求 。
先变一下求和顺序:
然后要求的就是 :
这样就能 求了。
所以时间复杂度为 ,但是常数会小很多。
36.P3746 六省联考 2017 组合数问题
我太唐了。下文基本 copy 自 https://www.luogu.com.cn/article/knllx86m。
然后循环卷积快速幂,时间复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步