静态问题下,可以预处理出每种权值的数对应的子序列,然后小的序列向大的归并即可做到很正确的复杂度(, 是为了保证每次询问只花 左右的复杂度)。但这个是可以去掉 的,我们可以对于所有长度大于等于 的都进行一遍 的扫描来处理出它与每种数之间的最短距离。
考虑动态维护这个事情。首先一定可以转化为小的向大的加入。我们可以对每种数,再维护一个附属集合。每次加入时,先将集合归并进附属集合中。每当附属集合大于 ,则将其与祝集合合并,并重新进行一次 的预处理,复杂度在均摊意义下依然正确。
莫队二次离线,即将莫队移动端点时需要进行的询问进行离线处理。利用 空间存下所有的二离询问。
那么有两种转化形式:1. 若这个询问满足可减性,则可以将其转化为前缀询问,可以用高复杂度插入低复杂度查询的数据结构来快速维护。2. 进行 次区间到区间之间的代价计算。
树分块:将树分成不超过 个大小不超过 的块,且使得每个块内,与其他块有连边的点(成为界点)不超过 个。这题可以很好地利用上树分块的性质。
一种想法是从 dp 想起,先用大状压压下所有已经被尝试的点和已经被选择的点。然后考虑少记一点信息,注意到:不可加入独立集的点之间是等价的,我们进行完每一次加入后,可以把此次加入后产生的新的不可加入的点,给提早确定它们的加入时间。于是就只需要记下接下来的可以加入独立集的点的集合。疑似是 的(但至少不会大于 )。
一种想法是,这种的随机方式,尝试一个不可能了的点是没有用的,其实也就相当于从还可以加入的点中等概率选一个。所以直接倒着 dp 就行了。
一个想法是从高到低位确定,考虑 check
的过程,|
运算的位相当于是直接把所有这一位为 的边删掉,&
运算相当于存在一个 0
,那么我们可以容斥哪几位全部为 1
。只有 ^
这一位最难算,只得将其转为计数问题,利用矩阵树定理套循环卷积的多元多项式(其实就是 xor fwt
)来解决。。
其实,不妨一开始直接求出每种答案的生成树的方案数,直接用一个每一位的运算不同的 fwt
来解决就行了。。
我的思考是:对于一个后缀数组,可以贪心地求出它的最小字符集大小——从小到大考虑, 和 比较,如果能令 就这么干,否则令 。然后就难以思考下去了。
更加深入的办法应该是将这个贪心性质给形式化:对于一个后缀数组,可以求出一个形如 的一个由大于号和小于号形成的链,最小字符集大小其实就等于其中的 个数 。设 为求出排列 对应的链,记 为 中的 个数, 当且仅当其小于号的集合被包含。那么问题通过提取同类项可以转化为:
对于 依然可以直接对 序列贪心;对于 ,我们可以求出 数组为 由 划分成的每一段的长度,设 ,则有 。那么就可以直接设计一个基于容斥的 dp 了,因为 函数是一个可分的 product
。
从小到大考虑,每次考虑值小于等于 且最大值等于 的连通块,显然这个连通块是确定的,问题就变为如何快速判断这个块里面有没有洞。
记 为元环(一个 小矩形里四个点都被选了)个数,那么有洞的个数 。(由欧拉公示可以得到)。
首先,问题等价于求:
这是一个经典问题,有 ,其中 是一个不超过 次的多项式 证明。那么根据 得:
设 ,则可以 地求出 关于 的表达式。根据其为不超过 次的多项式,则 次差分后一定为 :
于是可以解出 ,从而使用 插值得到 的值。
首先 Manacher
一下,然后变成了一个统计类问题,一个显然的办法是在 SAM
上打 tag。
事实上,不同回文子串数量只有 级别,并且一定可以用一棵树来表示,树上一条从父亲向儿子的有向边表示从父亲回文子串到儿子回文子串只需要从左右各添加一个相同字母。我们把这棵树建出来,然后在上面子树求和一下,就可以 了。