1.08

SAM 学习笔记

CF235C

求每个询问串的所有循环同构在主串中出现的次数总和。

向后遍历可做,现在需要删掉开头。删除开头 ,如果 ,那 就不能再在这个节点,

1.09

P4094

子串 的所有子串和 的最长公共前缀的长度的最大值。

二分答案 ,询问 是否在 中出现。设节点 表示 ,问 的 endpos 是否在 中有元素。

记录 表示 ,倍增 parent tree 跳到 。动态开点线段树合并 endpos 集合。

1.10

CF1237H

因为是对偶数位操作,将每两位和为一位。令 。如果有解,则

考虑从一个大问题转换为小问题。要找到一种方法使得在不改变其他结构的同时移动 。操作 可以实现两步将 换到 不改变结构的移到

所以从后向前,设当前维护到 ,此时 分别等于 。找到 ,执行上面操作即可。共 次操作。

现在问题是, ,我们要反转一次使

我们可以找到 中某个前缀,使得 ,翻转这个前缀。否则一定有 的某个前缀,使得 。这时翻转 的这个前缀得到 ,把 做成 再翻转这个前缀。

CF1329D

转换题意。对于 ,加入 长为

发现可行的 上操作对应 上:

  • 上删 ,其中 上删 ,形如 b…[bca]…a。

  • 上删 ,其中 上删 ,形如 [bca]…a。

显然优先操作一,答案与 中出现次数最大的 有关,设为

  • 。所有非 都与 操作一,用栈模拟,知道无法操作为止。

  • 其他情况。能配就配,直到成为上面的情况。用栈模拟,动态维护

从左到右操作,可以不用线段树,记录已删除量 。处理细节。

结束后栈不空,用操作二一个一个做。可能忽略 ,再用一次操作全部做完。

CF1396E

先求出可行的最大最小答案。

一条边将树分为 ,能贡献最大为 ,最小为 。最大时,间两两连边,最小时, 内部互相连,多出

拆开 ,可以取重心为根,最大贡献为向下的 。最大时所有路径跨过根。因为重心子树大小最大小于 ,构造取 dfn 序, 连边即可。

最大时点的贡献是到根的距离。取点 ,lca 为 。本来 各自的贡献是 ,连 后,贡献为 ,变化量模

变化为 。每次取出最大的 改为互相连,然后删掉。要保持重心结构,所以从最大 中选。最后当 ,因为 从最大往小,沿树向上一定找得到符合条件的。最后对没删掉的节点跑最大的构造。

1.11

P6240

次查询区间 01 背包,值域

可以 合并背包 求出单个 值。

猫树分治:选取所有询问都包含的某个位置,分别向左右预处理。对于询问的回答,只需要在左端点取信息,在右端点取信息,再合并即可。

分治 表示处理 的物品和 的询问。取 ,向左右背包。遍历 的询问,如果在左右就下放,否则合并算出答案。

复杂度

P5576

P5546 做区间询问。

作为文本串对其他所以 建的 SAM 匹配。复杂度 为定值, 越小越好。

猫树分治 ,选最小的 处理跨过 的询问。 过长复杂度退化,不能取中点分治。

取阈值 ,长度小于 的为短串,在短串中取中心。如果没有短串,。对于 ,最多分治 次,区间大小 ,匹配串 。共 ,复杂度

开一个大数组,然后用指针标记位置。

P4001

平面图最小割与对偶图最短路等价。

UVA10735

有向图欧拉回路当且仅当每个点入度等于出度。给无向边定向。先随便定向,记 。改变方向时 ,看作流量变化,连 的连 的连 。跑网络流看是否满流。

CF1383F

最大流等于最小割。 条特殊边割或不割 个状态。对于一个状态,先不管特殊边边权,割掉要割的特殊边,跑最小割,在加上要割的特殊边边权,对所有状态取 min 即为答案。

当特殊边边权为 ,一定被割;边权为 ,一定不割。

从全不割到全割的转移。在旧状态的残余网络上改边权再跑即可,。记录 个网络和当前状态的答案。

dinic 常数大,残余网络上用 FF,不过跟复杂度无关。

1.12

CF280D

长度为 的数列,支持:单点修改,区间询问至多选 个的不交子段和的最大值。

表示选 。要求至多 流的最大费用。

参考网络流反边,相当于每次取最大子段,再反转,重复 次。线段树维护从左、右开始最大值和位置,区间最大值和位置,以及反过来最小值。用栈记录翻过的位置,最后翻回来。

P5996

网络流。同 P2762 太空飞行计划问题 建图方式,将物品与 ,警察与 ,警察与对应的物品连 ,答案为所有物品的收益和减最小割。,显然跑不了网络流。考虑模拟最大流。

首先要描述警察 与物品 的关系。要满足:

。得到 ,能很好描述。

将物品和警察放在一起从左到右,从上到下考虑,自然满足 。贪心,一个警察 的流优先从 最小处流过来,因为更大的 能满足更多人限制。用 set 储存物品,警察处 lower_bound 查找。

gym102904B

划分序列,代价为 加区间逆序对数,求最小代价。

,满足决策单调性,单层转移。问题在求区间逆序对数。考虑类似莫队,要求左右两端移动次数不能过大。分治 移动 次,可以接受。cdq 分治分层做 sovle,维护树状数组。复杂度

1.13

CF1158F

一个序列的 即每次删除一个包含 的前缀能删的次数。

表示 中强制选 并正好选出 的子序列数。。设 表示以 结尾并强制选 的答案为 的数量。。因为答案小于 ,复杂度 。答案为 后乱选,设 表示答案至少为 的数量。,差分得答案。

CF666E

中哪个串出现次数最多。

建广义 SAM, 在上面跑匹配。如果 中出现,倍增找到 对应的节点。每个节点动态开点线段树,下标为 的编号,记录出现次数最大值和下标,线段树合并。

1.14

省选模拟1.14 T2 lis

求子序列最长长度使 lis 比原序列 lis 小。

连边 跑最小割。模拟最大流。分层,对于点 去到 层的区间 满足 。对于一个流,优先向 去,因此不需要退流。记录 表示是否走过, 指向下一个 的点。 模拟。

1.15

CF1498F

树上节点 个石子,每次选任意个移到 级祖先,不能动输,问以每个点为根先手胜负。

相等的分别考虑 SG 值。当 为偶数时, 没意义。因为先手移偶数位后手可以移回奇数位。设 表示 时的 SG 值。换根 dp。

CF1852C

初始全为 ,模 意义下最少多少次区间加 得到 数组。

如果不模 ,差分得 。预先对 区间加 代替取模,,最小化 。反悔贪心,取出最小的 和当前 做区间加后 ,把 入队。

CF1539F

中位数相关,考虑 设为 设为 ,做前缀和。 时可以任意排列。

  • 放在 前,设为

  • 否则, 放在 后,设为

要动态维护 。可以按 从小往大加入。初始时 ,当 改为 时,线段树维护区间

CF1797F

求恰好满足一个条件中的 个数: 编号最小的点; 编号最大的点。

容斥,。建大根、小根重构树, 为在两棵树都有祖先关系的点对。枚举一边,树状数组维护从根到当前节点在另一颗树上的 dfn 序,区间查询,单点修改。

P4248

。求

。lcp 看作公共前缀数量。记 表示节点 endpos 集合大小,对每个节点计算贡献,有 个串,每个串出现在 个后缀的前缀中,贡献

P2178

翻转建 SAM,lcp 转换为最长公共后缀,即 parent tree 上的 lca 的 len。记录子树内最大、次大、最小、次小。

P9970

极小的 mex 区间有 个。枚举 维护所有极小 ,不断向左右一边拓展至最近的 ,得到 的一个区间,所有这些区间包含所有极小区间,每次转移前删去非极小区间。计算区间 mex:可持久化线段树, 为版本,维护每个值最后出现的位置,二分。已知有极小区间 ,找到左右的 ,则 。所有 中的 存在 ,记录加入和删除位置,用 set 扫一遍。

1.16

arc162f

观察发现,第 ,则第 行能取 的位置是 的一个前缀。

但可以空一些行和列,考虑将所有有 的行和列压起来。设 表示前 行,有 个列有过 ,上一行有 ,强制连续选。首先可以取一个前缀,,后缀和维护。其次可以向前任意取,但强制连续选,枚举选 个,,维护一个斜线的前缀和。。再加上全取 的情况。

注意取模优化和枚举时 的常数!

1.18

CF814E

分层,只有层间和向下层的边。设当前层 个点, 个二度, 个三度,层间连 条。

  • 向下层:

  • 层间:,将二度点当两个点,再出去对的相对顺序。

  • 容斥掉 个重边、 个自环,设

CF1142E

维护一个可行答案集合,取出两个询问,将不可行的扔掉。要保证每次询问不能问到粉边,要求每个粉连通块只有一个点在集合中。强行当成 DAG,如果不行再将联通块其他点加入。

CF1240F

构造。将边拆为 ,二分图,如果能使每个点极差不超过 ,合并后不超过 。设点 度数为 ,拆为 个点。边染色使所有出边颜色不同。同 CF600F

1.19

arc134e

  • 必胜。 必败。

  • 否则 必胜。

  • 否则 必胜。

  • 否则模 后如果 必胜。

  • 否则 必败,否则模 必胜。

如果 ,难以分类讨论。有 ,状压计算出现次数和胜负。

CF487E

圆方树。求出点双,对每个点双建方点,原图点是圆点,方点与对应的圆点连边。

当进入一个点双,一定能到点双中权值最小的点。方点权值为最小的圆点权值,multiset 维护删除,树剖维护路径最小值。

1.20

agc010e

对于不互质的数,后手操作后先后顺序不变。对所有不互质的连边。要求定向后最大拓扑序最小。按权值从小到大 dfs 儿子连边,拓扑时用优先队列。

1.21

P5292

从长为 的回文串开始枚举左右出边 bfs,复杂度 。减少无用的边。将 分开,形成若干连通块。如果连通块为二分图,两点间奇偶性相同,可以反复横跳,取生成树即可。不是二分图,连自环即可。边数将为

1.22

CF1609F

枚举每个颜色 ,枚举右端,线段树区间维护左端 min 和 max 是否符合条件。

CF1280D

树形 dp。设 表示 子树内分 段的最大数量。难以记录 所在连通块状态。设 表示最大数量下 的值。背包

1.23

CF1218A

是基环树。先考虑树。如果从一个点开始,定为根,。换根 dp 即可。

把环找出来,考虑在环上点 的子树中开始染色的答案。染色的方式是大致是从子树的叶子开始向上。对 的每个非环上儿子做树的 dp。记 表示从环上进入子树向下染色的答案, 表示换根的、从子树内任意节点开始染色的方案。从环上 的非环上儿子 的子树开始的答案是 。染完环上 的子树后,绕环染环上点。再从除 外的环上点向下染其他环上点的子树,答案为

发现前后贡献固定,变动的是染环的顺序。染环是染一个区间,每次向左右拓展。每次染一个点,答案加上当前连通块大小,当前连通块大小减 。贪心向小的染是错的,因为有后效性。记录 的前缀和,区间 dp, 向左右转移,滚动即可。

1.24

CF288E

维护 的数量、和、平方和。

省选模拟1.24 T2 lottop

对于平面图,,顶点数、边数、平面数。每个面至少围 条边,每条边对应两个面,。平面图存在点度数小于等于 ,对偶图也是平面图存在点度数小于等于 ,平面图存在环小于等于 。判三、四元环。

根号分治,按度数、大小定向为 DAG。复杂度

P7372

连成若干个环,。要 ,取 。构造交换相邻的方案。

1.28

P7482

cdq 分治拆成 的贡献。

对于一个区间计算答案可以用 dp 完成。以 为交界合并左右的 dp 值。设 表示区间 或区间 ,是否选 的答案。记跨过 的贡献为

后面两个直接做,前面的对于每个 拆开 max 计算。

排序,二分 的位置,记录 的后缀和即可。递归 解决。