二月没写
3.01
先考虑完全二叉树的 lca 求法。中序遍历分配编号。设第 位是 最左边的 ,则 是 的 位以左、第 位是 , 位以右是 。
将树上 lca 转到完全二叉树上。先序遍历,设 表示 的末尾连续 数, 表示 子树内最大 的值, 表示 对应的 。相等的 形成若干条链。有若 是 的祖先, 是 完全二叉树中的祖先。
是 的公共祖先。树上根到节点路径上 单调不降,但在树上的 值不连续。设 表示从根到 哪些 值存在。可以求出 和 在完全二叉树上的 lca 的末尾零数 ,在 和 中都出现的最小的 就是 的末尾零数。
每种 值都会形成一条链。找到 到链 上的最近祖先深度较小的一个即为 lca。可以找到 中小于 的最大的 ,这条链的链顶的父亲在链 上。
预处理 ,查询 ,空间 。理论上完全偏序所有 lca 算法。
3.05
设 表示覆盖完 子树,向上覆盖到深度 的最小代价。要求区间取 min,区间加,线段树合并。
cdq 分治。记 表示 或 的 最大值。
分类讨论 : 。枚举 ,不断加入 ,单调栈维护一次函数 ,斜率递减,查询的横坐标不增。反之同理。
3.06
时间倒流,第一次到达一个点写下数字。每次会往当前形成的段前后加数,需要花费时间跨越整个段。所以除了 可能不是 lis 以外,所有向左右拓展的数都是 lis 的一部分。设 表示当前有长为 的连续段,从后往前遍历到 且 填入最左时最右的最小值。 相反。
分类讨论 ,树状数组维护前缀 max 和后缀 min。
随机排列的 lis 期望长度为 ,复杂度 。
3.07
设 表示 的答案。取 为 中最大 的位置。
区间最大值有关的 dp,建出笛卡尔树。递归左右子树得到 和 ,只考虑以树上节点对应的区间的 为左端点的 dp 值。将询问拆成 和 ,挂在 的节点,另一半反过来再做。
对于左端点在 且跨过 的答案,min 左边增幅为 ,右边小于等于 ,单调。线段树维护,支持区间加一次函数,线段树上二分。
3.08
莫队。当向右拓展时,加上 的贡献。设区间最小值位置为 , 以左加上 。设 为以 为右端点,左端点在 的贡献。 为 左边第一个比 小的位置。
。与 无关,变成前缀和。
做前缀和。转换为选 个有序对的和最大值除以 。将 插入 trie,对每个 求出第 大的 ,扔进优先队列,取出时加入 大。
求出每个点到最近的关键的的距离 。能从 走到 则有 。建最小生成树,倍增求路径最大值。
3.09
维护当前 border 集合。从 的合法集合过来,如果 则删去,如果 则加入 。一共只有 个 border。
考虑删除那些。对于每个节点每种颜色找出在 nxt 上, 的最近祖先,把除了颜色 的一路跳上去删掉。末尾添数维护 st 表最小值计算删除的代价。每个删一次,复杂度 。
对于合法的那些,权值对 取 min。用 map 维护每个权值的个数,将大于 的数量加进 ,每个权值操作一次,复杂度 。
枚举分界点 ,以 结尾匹配 ,以 开始匹配 的方案数之积。建 ACAM,当前节点 fail 树到根的路径上的终止状态数为比配数,反转再做另一边。
可以 次二分出一个点走 步到哪里。有两种用法:求出走 步得到环上的某个点和走 步得到该点下一个点。
先找出一个点在 联通块的环上,在向下走 步找到环上连续的 个点。对剩下 个点找出 步到这 个点之一的点。这时至少已知环上连续的 个点,有一半的环已知,其他的点走 步或 步如果在联通块内则一定能到这一半的环。总步数 。
这么做的关键是环上连续点长度可以倍增,如果将 调小步数更少。
3.11
加强构造条件,改为:构造一个逐步染黑序列,使得每一时刻黑白导出子图都连通。每次选一个与黑色点有连边且不是白导出子图的割点的白点染黑。
证明一定有这样的点。找到白导出子图中只与一个割点相邻的块,如果黑导出子图与这个块没有连边,改割点是全图割点,但是原图是点双,矛盾。所有一定存在可以染的点。每次求割点,复杂度 。
先猜测最后每个点权值 为集合编号。边权为 相当于删掉这条边。找出一颗生成树,从下往上定边权可以满足除根以外的所有点。再调整根。
如果存在一个奇环,将每条边权交替加 或 ,可以只改一个点,将根设在环上。否则二分图,左部为 ,右部 为 ,左部点为根,选出与根相连的两条边加一, 。
3.12
将 插入 01 trie,从高位到低位考虑。在第 位,以前选的数 ,当前 集合中最小值 ,当前答案 。记录 trie 节点 最小值和 的和。
如果填 ,左边小于右边。如果左边可以全部进入 :如果左边进入后的 无论如何都没右边大,更新答案;否则更新 进入左边。否则:如果 无论如何都没有右边大,更新答案;否则右边最小,进入右边。
设 表示节点 且第一个是 的最小代价,记录从什么转移而来。
再 dfs 一边,可以花费代价调整一些选择升级答案。特别注意可以选择将选择 改为选择 。
注意到合法状态 个,前后缀优化,复杂度 。
3.13
把每个数记录为 ,如果有包含更小的把更小的扔掉,BIT 维护。先考虑 ,再把每个点改为包含他的数的最大值。但是可能有不在原数组中的数,有且只有一个。从高到低枚举 ,取 为小于 且不存在于原数组的最大数,如果 的 被 的 包含,就可以将 中非端点的数改为 ,算一下答案取 最大的 。
每一个白点子树内的节点都是白点,等价于黑点形成联通块。树上联通块数等于点数减边数。白连通块数等于异色边数。
维护 表示连通块数 ,权值为 ,求 时 。 初始值取 ,对于一条边 ,设 比 先遍历到, 加 , 加 。维护区间最小值大小、数量、权值和,区间加。
3.15
从高往低贪心 和 。维护当前 的超集和子集。
拆方差的期望: 。
连通块数等于点数 减边数 加环数 。
鞅与停时。对于有 个儿子的点,设计函数 。
可以 高斯消元。找规律令 ,
,且 。
带回去发现符合条件。所以 。复杂度 。
并查集将相同的连在一起。总共有 个有效状态,只要没有重复做就可以。倍增 向上 个祖先的状态,分别考虑从下往上和从上往下。将两条路径拆为 段,每段倍增 次合并。每次合并向下一层递归合并,如果已经是一个连通块的及时退出。复杂度 。
3.17
离散化。对 X 轴扫描线,线段树维护 Y 轴区间。记录区间已选最小和未选最大,set 维护区间里所有的值。每次如果有未选最大大于已选最小,打标记,再做一次。复杂度 。
3.18
设 为已有 个球为钦定颜色。
其中 为当前局面钦定颜色成为最后颜色的概率,见 P5155 。移项得 递推式。答案为 。
对于每个区间算 SG 值,枚举删 ,转换为若干个子区间的 SG 异或,前缀和维护,复杂度 。考虑有用的区间,是两个相同字符间的一段以及前后缀。共 个区间,从小到大计算,复杂度 。
3.19
并查集维护强连通分量以及最左和最右。线段树 vector 维护节点对应的线段,每次加入一条线段,把之前线段经过当前左右端点的并入连通块,再把当前线段拆成 段扔进线段树节点。
拆为对 询问 。建 AC 自动机,把 每个前缀对应的状态加 ,求 fail 树上的子树和,dfn 序加树状数组。
反过来,答案为将 每个前缀加 求 终止节点的 fail 子树和。
根号分治。对于大于 的串,先将 每个前缀对应位置加 ,此时每个 终止节点的子树和就是 的贡献,前缀和。复杂度 。否则从 到 ,区间加单点查,dfn 序加树状数组,复杂度 。
加强构造条件,任意排序 A 和 B 一定有两个子段相等。即两对 。
令 。对于每个 找到最小的 ,有 。 个数,值域为 ,一定存在相等。
3.20
对于一个数字做背包, 表示当前位能不能凑出 。 , 。答案一定在 中,发现大于 的背包不优。
当做 位时,这个背包状态有 种。实验发现, 也是全部状态数。可以用数位 dp 套这个背包。宽搜所有转移。
设 为当前剩下后 位随便选,当前在内层自动机的位置为 ,最最小值小于 的答案。 组询问,差分询问 ,按 从高位到低位在自动机上走,如果没有限制就加上对应的 f 值。
记录状态一个 位 01 串方面,卡哈希,可以考虑用一个 pair
记两个 long long
表示前一半后一半的值。
3.21
前缀和。反转 后 。取最大的 ,操作 和 。 。
特判不用做,考虑做一次。找到第一个小于 和最后一个大于 的区间 ,翻转 且 。 ,找到最大的 和 判断。
递增子序列以 增加,将 二进制拆分。设 是 二进制最高位,先造长为 的连续单调上升。加入 时,不断下降放在最开始的单调上升的后 个之前。共 。考虑将后面部分两步改为一步。如果有连续的 和 需要操作,直接在 前放大于后面放的最小值和次小值的数。
因为是一棵树,最短路径唯一,所以每次都让一个人走到底。当走 , 中此时没有点,意味着起点这条路径上的人一定先于这个人走,终点在这条路径上的人一定后于这个人走。连边跑拓扑排序看有没有环。复杂度 。倍增优化 。
3.22
曼哈顿转切比雪夫,二分答案,扫描 X 轴,set 维护 Y 轴,二分 ,枚举到 ,找到大于 个就返回。复杂度 。
如果多天走完。第一天,时间倒流, 次最短路以 为终点,从 出发的最晚时间。最后一天, 次最短路以 为起点,到 的最早时间。稠密图上 dij 复杂度 。中间部分,把最后一天算出来的一天能走到的 连边权为 的边做弗洛伊德。复杂度 。对于每个询问,枚举第一天去哪里,最后一天开始时在那里,复杂度 。对于已知的第一天终点和全程终点, 预处理最后一天终点,复杂度 。
如果一天走完,答案只可能有 次变大。算出每条边断开前 的最晚出发时间和答案,去掉被包含的部分,二分查询的时间属于那一段。复杂度 。
3.25
对于一个点维护 。对于操作一,等价于 加 , 的子树不含 减 。对于操作二,等价于从根到 路径上的 的和。子树加,路径查,树剖加线段树。
3.26
分类讨论。如果 存在一个周期,设最小周期长为 。那么第 次操作是在 长度上加 。用字符串哈希判断是否存在长为 的周期,只需要判断 。
如果 不存在一个周期,找到真 border ,再找到 的最小周期 ,发现此时答案只取决于 开头存在 个连续的 。记 ,发现每次操作答案增加 个 。模拟前 次操作后每次操作答案增加为定值,计算等差数列。
求最大的 。
。不一定有逆元。设 ,得到 。当 中恰好有 个 且 中至少有 个 是有解。每次枚举 ,从低到高建 trie 树,把贡献加在 对应的位置上,相当于整个子树都有加 的贡献。答案为最大的链和。
P5853 。求所有长为 的逆序对数为 的排列中 在小根笛卡尔树上的深度之和。
先 dp 满足逆序对数的排列个数。加入第 个数产生 对逆序对。将深度转为祖先个数。 是 的祖先,即 处逆序对数贡献为 ,撤销背包即可。翻过来再做一遍。
3.27
Q6842 。 ,其中 。 为 个 顺次拼接, 次询问 在 中出现次数。
对 建 AC 自动机,答案为在自动机上走 ,走到的每个节点加 , 终止节点的 fail 树子树和。
倍增拆开 。记 为 ,有 。对于 ,也有 。所以可以将 拆为 个区间。
记 表示自动机上 节点走 到的点, 为自动机上 节点走 的次数。分别从下一层和上一层得到。
3.28
设 表示选了 个,以第 个串结尾的长度。 哈希处理转移,矩阵快速幂。
弗洛伊德算一次魔法从 到 的代价。矩阵快速幂。
对于颜色 的两个点 ,选颜色 就路径 上的所有颜色都要选。倍增优化建图,每个节点连向对应颜色, 连向所有颜色为 的节点的 lca 到颜色为 的节点的链连边。缩点,入度为 的 scc 中有效的点的数量。
以区间最大值区间为中点,枚举短的一边,二分另一半。复杂度 。
3.29
选一些行异或,如果不是全零的话答案为 。只需要求若干行异或后全零的方案数,将一行看作大小为 的数,bitset 维护做线性基。
移动骨牌相当于移动空格,按黑白分开,可以移动的连有向边,可以证明这是两组森林。去掉一个骨牌两个空格可以移动到两个子树任意位置,但有重复。用 dfn 序记录一段区间,扫描线算矩阵面积并。
。转换为最小 and 和。每一位单独贡献。01 序列的 and 相当于乘法。对每个循环位移长度 记 。
把 b 复制一遍。 。差卷积。
3.30
P006 。以 为根的有根树,每个节点有一定数量的奶牛,每单位时间每条边限制流量,奶牛单位时间内可以移动多步,多组询问一定时间内能到达根的最多的奶牛个数。
计算每个点人数减少速度。当一个点送完人后,再有人从下方送来直接往上转,所以可以在并查集上将 与 合并。从小到大处理,知道询问属于哪个段即可。
若 ,则 符合条件。求有多少种合法划分方案数。
。容斥,等于所有减不满足 min 减不满足 max 加两个都不满足。考虑合法区间的矩形面积并,对于每个 ,满足 min 的区间形如一个矩形减一个平行于 的三角形。三角形无法扫面线,但是可以看成以区间最小值分治然后枚举短的一边。所以把 个矩形减三角形拆成 个矩形。维护区间最小值和最小值对应的 f 值,扫描线更新 f。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下