二月没写
3.05
设 d p u , i dp_{u,i} d p u , i 表示覆盖完 u u u 子树,向上覆盖到深度 i i i 的最小代价。要求区间取 min,区间加,线段树合并。
d p i = min ( f j + ( i − j ) × max a k ) dp_i=\min(f_j+(i-j)\times \max a_k)
d p i = min ( f j + ( i − j ) × max a k )
cdq 分治。记 m x i mx_i m x i 表示 ( i , m i d ] (i,mid] ( i , m i d ] 或 [ m i d + 1 , i ] [mid+1,i] [ m i d + 1 , i ] 的 a k a_k a k 最大值。
d p i = min ( f j + ( i − j ) × max ( m x i , m x j ) ) dp_i=\min(f_j+(i-j)\times \max(mx_i,mx_j))
d p i = min ( f j + ( i − j ) × max ( m x i , m x j ) )
分类讨论 m x j ≤ m x i mx_j\le mx_i m x j ≤ m x i :d p i = min ( j × ( − m x i ) + f j ) + i × m x i dp_i=\min(j\times (-mx_i)+f_j)+i\times mx_i d p i = min ( j × ( − m x i ) + f j ) + i × m x i 。枚举 i i i ,不断加入 j j j ,单调栈维护一次函数 y = j x + f j y=jx+f_j y = j x + f j ,斜率递减,查询的横坐标不增。反之同理。
3.06
时间倒流,第一次到达一个点写下数字。每次会往当前形成的段前后加数,需要花费时间跨越整个段。所以除了 a n a_n a n 可能不是 lis 以外,所有向左右拓展的数都是 lis 的一部分。设 f l , i f_{l,i} f l , i 表示当前有长为 l l l 的连续段,从后往前遍历到 i i i 且 a i a_i a i 填入最左时最右的最小值。g l , i g_{l,i} g l , i 相反。
f l , i = max ( max j > i ∨ a j > a i f l − 1 , j , max j > i ∨ g l − 1 , j > a i a j ) f_{l,i}=\max(\max_{j>i\lor a_j>a_i} f_{l-1,j},\max_{j>i\lor g_{l-1,j}>a_i} a_j)
f l , i = max ( j > i ∨ a j > a i max f l − 1 , j , j > i ∨ g l − 1 , j > a i max a j )
分类讨论 a n a_n a n ,树状数组维护前缀 max 和后缀 min。
随机排列的 lis 期望长度为 O ( n ) O(\sqrt n) O ( n ) ,复杂度 O ( n n log n ) O(n\sqrt n\log n) O ( n n log n ) 。
3.07
设 d p l , r dp_{l,r} d p l , r 表示 [ l , r ] [l,r] [ l , r ] 的答案。取 m i d mid m i d 为 [ l , r ] [l,r] [ l , r ] 中最大 a i a_i a i 的位置。
d p l , r = min ( d p l , m i d + ( r − m i d ) × a m i d + d p m i d + 1 , r + ( m i d − l + 1 ) × a m i d ) dp_{l,r}=\min (dp_{l,mid}+(r-mid)\times a_{mid}+dp_{mid+1,r}+(mid-l+1)\times a_{mid})
d p l , r = min ( d p l , m i d + ( r − m i d ) × a m i d + d p m i d + 1 , r + ( m i d − l + 1 ) × a m i d )
区间最大值有关的 dp,建出笛卡尔树。递归左右子树得到 d p l , i , l ≤ i ≤ m i d dp_{l,i},l\le i\le mid d p l , i , l ≤ i ≤ m i d 和 d p m i d + 1 , i , m i d + 1 ≤ i ≤ r dp_{mid+1,i},mid+1\le i\le r d p m i d + 1 , i , m i d + 1 ≤ i ≤ r ,只考虑以树上节点对应的区间的 l l l 为左端点的 dp 值。将询问拆成 [ l , m i d − 1 ] [l,mid-1] [ l , m i d − 1 ] 和 [ m i d + 1 , r ] [mid+1,r] [ m i d + 1 , r ] ,挂在 l = q l , r = m i d l=ql,r=mid l = q l , r = m i d 的节点,另一半反过来再做。
对于左端点在 l l l 且跨过 m i d mid m i d 的答案,min 左边增幅为 a m i d a_{mid} a m i d ,右边小于等于 a m i d a_{mid} a m i d ,单调。线段树维护,支持区间加一次函数,线段树上二分。
3.08
莫队。当向右拓展时,加上 [ l , r + 1 ] , ⋯ , [ r + 1 , r + 1 ] [l, r+1],\dotsb ,[r+1,r+1] [ l , r + 1 ] , ⋯ , [ r + 1 , r + 1 ] 的贡献。设区间最小值位置为 p p p ,p p p 以左加上 a p a_p a p 。设 f l , r f_{l,r} f l , r 为以 r r r 为右端点,左端点在 [ l , r ] [l,r] [ l , r ] 的贡献。p r e i pre_i p r e i 为 i i i 左边第一个比 a i a_i a i 小的位置。
f l , r = f l , p r e r + a r × ( r − p r e r ) f_{l,r}=f_{l,pre_r}+a_r\times (r-pre_r) f l , r = f l , p r e r + a r × ( r − p r e r ) 。与 l l l 无关,变成前缀和。
做前缀和。转换为选 2 ∗ k 2*k 2 ∗ k 个有序对的和最大值除以 2 2 2 。将 a 0 ⋯ a n a_0\dotsb a_n a 0 ⋯ a n 插入 trie,对每个 i i i 求出第 n u m num n u m 大的 a i x o r a j a_i xor a_j a i x o r a j ,扔进优先队列,取出时加入 n u m + 1 num+1 n u m + 1 大。
求出每个点到最近的关键的的距离 d i s u dis_u d i s u 。能从 u u u 走到 v v v 则有 d i s u + d i s v + e u , v ≤ c dis_u+dis_v+e_{u,v}\le c d i s u + d i s v + e u , v ≤ c 。建最小生成树,倍增求路径最大值。
3.09
维护当前 border 集合。从 i − 1 i-1 i − 1 的合法集合过来,如果 s x + 1 ≠ s i s_{x+1}\ne s_i s x + 1 = s i 则删去,如果 s i = s 1 s_i=s_1 s i = s 1 则加入 [ i , i ] [i,i] [ i , i ] 。一共只有 O ( n ) O(n) O ( n ) 个 border。
考虑删除那些。对于每个节点每种颜色找出在 nxt 上,s x + 1 = s i + 1 s_{x+1}=s_{i+1} s x + 1 = s i + 1 的最近祖先,把除了颜色 s i s_i s i 的一路跳上去删掉。末尾添数维护 st 表最小值计算删除的代价。每个删一次,复杂度 O ( n log n ) O(n\log n) O ( n log n ) 。
对于合法的那些,权值对 a i a_i a i 取 min。用 map 维护每个权值的个数,将大于 a i a_i a i 的数量加进 a i a_i a i ,每个权值操作一次,复杂度 O ( n log n ) O(n\log n) O ( n log n ) 。
枚举分界点 p p p ,以 p p p 结尾匹配 s i s_i s i ,以 p + 1 p+1 p + 1 开始匹配 s j s_j s j 的方案数之积。建 ACAM,当前节点 fail 树到根的路径上的终止状态数为比配数,反转再做另一边。
可以 log n = 9 \log n=9 log n = 9 次二分出一个点走 k k k 步到哪里。有两种用法:求出走 n + 1 n+1 n + 1 步得到环上的某个点和走 1 1 1 步得到该点下一个点。
先找出一个点在 1 1 1 联通块的环上,在向下走 124 124 1 2 4 步找到环上连续的 125 125 1 2 5 个点。对剩下 375 375 3 7 5 个点找出 125 125 1 2 5 步到这 125 125 1 2 5 个点之一的点。这时至少已知环上连续的 250 250 2 5 0 个点,有一半的环已知,其他的点走 n + 1 n+1 n + 1 步或 n + 1 + 250 n+1+250 n + 1 + 2 5 0 步如果在联通块内则一定能到这一半的环。总步数 9 × 125 + 375 + 2 × 250 = 2000 9\times 125+375+2\times 250=2000 9 × 1 2 5 + 3 7 5 + 2 × 2 5 0 = 2 0 0 0 。
这么做的关键是环上连续点长度可以倍增,如果将 125 125 1 2 5 调小步数更少。
3.11
加强构造条件,改为:构造一个逐步染黑序列,使得每一时刻黑白导出子图都连通。每次选一个与黑色点有连边且不是白导出子图的割点的白点染黑。
证明一定有这样的点。找到白导出子图中只与一个割点相邻的块,如果黑导出子图与这个块没有连边,改割点是全图割点,但是原图是点双,矛盾。所有一定存在可以染的点。每次求割点,复杂度 O ( n m ) O(nm) O ( n m ) 。
先猜测最后每个点权值 m o d 3 mod 3 m o d 3 为集合编号。边权为 3 3 3 相当于删掉这条边。找出一颗生成树,从下往上定边权可以满足除根以外的所有点。再调整根。
如果存在一个奇环,将每条边权交替加 1 1 1 或 2 2 2 ,可以只改一个点,将根设在环上。否则二分图,左部为 1 1 1 ,右部 为 2 2 2 ,左部点为根,选出与根相连的两条边加一,w r t = 1 , w u = w v = 0 w_{rt}=1,w_u=w_v=0 w r t = 1 , w u = w v = 0 。
3.12
将 a i a_i a i 插入 01 trie,从高位到低位考虑。在第 d e p dep d e p 位,以前选的数 x x x ,当前 S S S 集合中最小值 y y y ,当前答案 z z z 。记录 trie 节点 a a a 最小值和 b b b 的和。
如果填 x = 0 x=0 x = 0 ,左边小于右边。如果左边可以全部进入 S S S :如果左边进入后的 y y y 无论如何都没右边大,更新答案;否则更新 y y y 进入左边。否则:如果 y y y 无论如何都没有右边大,更新答案;否则右边最小,进入右边。
设 d p u , i dp_{u,i} d p u , i 表示节点 u u u 且第一个是 i i i 的最小代价,记录从什么转移而来。
d p u , min ( i , j ) = d p l s , i + min ( a u , d p r s , j ) dp_{u,\min(i,j)}=dp_{ls,i}+\min(a_u,dp_{rs,j})
d p u , min ( i , j ) = d p l s , i + min ( a u , d p r s , j )
再 dfs 一边,可以花费代价调整一些选择升级答案。特别注意可以选择将选择 a u a_u a u 改为选择 d p r s , j dp_{rs,j} d p r s , j 。
注意到合法状态 O ( n 2 n ) O(n2^n) O ( n 2 n ) 个,前后缀优化,复杂度 O ( n 2 n ) O(n2^n) O ( n 2 n ) 。
3.13
把每个数记录为 ( l , r , x ) (l,r,x) ( l , r , x ) ,如果有包含更小的把更小的扔掉,BIT 维护。先考虑 a n s l = a n s r = x ans_l=ans_r=x a n s l = a n s r = x ,再把每个点改为包含他的数的最大值。但是可能有不在原数组中的数,有且只有一个。从高到低枚举 x x x ,取 n w nw n w 为小于 x x x 且不存在于原数组的最大数,如果 n w nw n w 的 ( l , r , n w ) (l,r,nw) ( l , r , n w ) 被 x x x 的 ( L , R , x ) (L,R,x) ( L , R , x ) 包含,就可以将 [ L , R ] [L,R] [ L , R ] 中非端点的数改为 n w nw n w ,算一下答案取 s u m sum s u m 最大的 n w nw n w 。
每一个白点子树内的节点都是白点,等价于黑点形成联通块。树上联通块数等于点数减边数。白连通块数等于异色边数。
维护 ( x , v ) (x,v) ( x , v ) 表示连通块数 x x x ,权值为 v v v ,求 x = 1 x=1 x = 1 时 ∑ v \sum v ∑ v 。x i x_i x i 初始值取 n − i − ( n − 1 ) n-i-(n-1) n − i − ( n − 1 ) ,对于一条边 ( u , v ) (u,v) ( u , v ) ,设 u u u 比 v v v 先遍历到,x t u ⋯ x n − 1 x_{t_u}\dotsb x_{n-1} x t u ⋯ x n − 1 加 1 1 1 ,v t u ⋯ v t v − 1 v_{t_u}\dotsb v_{t_v-1} v t u ⋯ v t v − 1 加 1 1 1 。维护区间最小值大小、数量、权值和,区间加。
3.15
max ( max ( a i o r x ) − min ( a i o r x ) ) = max ( a i o r a j − a j ) = max ( a i − a i a n d a j ) \max(\max(a_i \mathrm{or} x)-\min( a_i \mathrm{or} x))=\max(a_i \mathrm{or} a_j-a_j)=\max(a_i-a_i \mathrm{and} a_j)
max ( max ( a i o r x ) − min ( a i o r x ) ) = max ( a i o r a j − a j ) = max ( a i − a i a n d a j )
从高往低贪心 min x a n d a i \min x \mathrm{and} a_i min x a n d a i 和 max x o r a i \max x \mathrm{or} a_i max x o r a i 。维护当前 a i a_i a i 的超集和子集。
拆方差的期望:E ( ( x − E ( x ) ) 2 ) = E ( x 2 − 2 x E ( x ) + E ( x ) 2 ) = E ( x 2 ) − E ( x ) 2 E((x-E(x))^2)=E(x^2-2xE(x)+E(x)^2)=E(x^2)-E(x)^2 E ( ( x − E ( x ) ) 2 ) = E ( x 2 − 2 x E ( x ) + E ( x ) 2 ) = E ( x 2 ) − E ( x ) 2 。
连通块数等于点数 v v v 减边数 e e e 加环数 c c c 。
E ( x 2 ) = E ( a ) 2 + E ( b ) 2 + E ( c ) 2 − 2 E ( a b ) + 2 E ( a c ) − 2 E ( b c ) E(x^2)=E(a)^2+E(b)^2+E(c)^2-2E(ab)+2E(ac)-2E(bc)
E ( x 2 ) = E ( a ) 2 + E ( b ) 2 + E ( c ) 2 − 2 E ( a b ) + 2 E ( a c ) − 2 E ( b c )
鞅与停时。对于有 x x x 个儿子的点,设计函数 f x f_x f x 。
f x + f y − 1 = 1 2 ( x × f 0 + f y + 1 + y × f 0 + f x + 1 ) f_x+f_y-1=\frac{1}{2}(x\times f_0+f_{y+1}+y\times f_0+f_{x+1})
f x + f y − 1 = 2 1 ( x × f 0 + f y + 1 + y × f 0 + f x + 1 )
可以 O ( n 3 ) O(n^3) O ( n 3 ) 高斯消元。找规律令 x = y x=y x = y ,
2 × f x − 1 = x × f 0 + f x + 1 2\times f_x-1=x\times f_0+f_{x+1}
2 × f x − 1 = x × f 0 + f x + 1
f x = ( x + 1 ) × f 0 − 2 x + 1 f_x=(x+1)\times f_0-2^x+1 f x = ( x + 1 ) × f 0 − 2 x + 1 ,且 f n − 1 = 0 f_{n-1}=0 f n − 1 = 0 。
带回去发现符合条件。所以 f A = ∑ f x f_A=\sum f_x f A = ∑ f x 。复杂度 O ( n ) O(n) O ( n ) 。
并查集将相同的连在一起。总共有 n − 1 n-1 n − 1 个有效状态,只要没有重复做就可以。倍增 u u u 向上 2 i 2_i 2 i 个祖先的状态,分别考虑从下往上和从上往下。将两条路径拆为 3 3 3 段,每段倍增 O ( log n ) O(\log n) O ( log n ) 次合并。每次合并向下一层递归合并,如果已经是一个连通块的及时退出。复杂度 O ( n log 2 n ) O(n\log^2 n) O ( n log 2 n ) 。
3.17
离散化。对 X 轴扫描线,线段树维护 Y 轴区间。记录区间已选最小和未选最大,set 维护区间里所有的值。每次如果有未选最大大于已选最小,打标记,再做一次。复杂度 O ( n log 2 n ) O(n\log^2 n) O ( n log 2 n ) 。
3.18
设 f i f_i f i 为已有 i i i 个球为钦定颜色。
f i = f i − 1 × i × ( s u m − i ) s u m × ( s u m − 1 ) + f i + 1 × ( s u m − i ) × i s u m × ( s u m − 1 ) + f i × ( 1 − i × ( s u m − i ) s u m × ( s u m − 1 ) ) + v f_i=f_{i-1}\times \frac{i\times (sum-i)}{sum\times(sum-1)}+f_{i+1}\times \frac{(sum-i)\times i}{sum\times(sum-1)}+f_i\times(1-\frac{i\times (sum-i)}{sum\times(sum-1)})+v
f i = f i − 1 × s u m × ( s u m − 1 ) i × ( s u m − i ) + f i + 1 × s u m × ( s u m − 1 ) ( s u m − i ) × i + f i × ( 1 − s u m × ( s u m − 1 ) i × ( s u m − i ) ) + v
其中 v v v 为当前局面钦定颜色成为最后颜色的概率,见 P5155 。移项得 O ( n ) O(n) O ( n ) 递推式。答案为 ∑ f a i \sum f_{a_i} ∑ f a i 。
对于每个区间算 SG 值,枚举删 c c c ,转换为若干个子区间的 SG 异或,前缀和维护,复杂度 O ( ∣ ∑ ∣ ) O(\mid \sum\mid) O ( ∣ ∑ ∣ ) 。考虑有用的区间,是两个相同字符间的一段以及前后缀。共 O ( n ∑ ) O(n\sum) O ( n ∑ ) 个区间,从小到大计算,复杂度 O ( n ∣ ∑ ∣ 2 ) O(n\mid\sum\mid^2) O ( n ∣ ∑ ∣ 2 ) 。
3.19
并查集维护强连通分量以及最左和最右。线段树 vector 维护节点对应的线段,每次加入一条线段,把之前线段经过当前左右端点的并入连通块,再把当前线段拆成 log n \log n log n 段扔进线段树节点。
拆为对 s 1 ⋯ i s_{1\dotsb i} s 1 ⋯ i 询问 s k s_k s k 。建 AC 自动机,把 s i s_i s i 每个前缀对应的状态加 1 1 1 ,求 fail 树上的子树和,dfn 序加树状数组。
反过来,答案为将 s k s_k s k 每个前缀加 1 1 1 求 s l ⋯ r s_{l\dotsb r} s l ⋯ r 终止节点的 fail 子树和。
根号分治。对于大于 B B B 的串,先将 s k s_k s k 每个前缀对应位置加 1 1 1 ,此时每个 s i s_i s i 终止节点的子树和就是 s i s_i s i 的贡献,前缀和。复杂度 O ( ∣ S ∣ 2 B ) O(\frac{\mid S\mid^2}{B}) O ( B ∣ S ∣ 2 ) 。否则从 1 1 1 到 n n n ,区间加单点查,dfn 序加树状数组,复杂度 O ( q B log ∣ S ∣ ) O(qB\log {\mid S\mid}) O ( q B log ∣ S ∣ ) 。
加强构造条件,任意排序 A 和 B 一定有两个子段相等。即两对 a i = b j a_i=b_j a i = b j 。
令 a n < b n a_n<b_n a n < b n 。对于每个 i i i 找到最小的 b j ≥ a i b_j\ge a_i b j ≥ a i ,有 b j − a i ∈ [ 0 , n ) b_j-a_i\in [0,n) b j − a i ∈ [ 0 , n ) 。n + 1 n+1 n + 1 个数,值域为 n n n ,一定存在相等。
3.20
对于一个数字做背包,f i f_i f i 表示当前位能不能凑出 i i i 。f i − > f ∣ i − v ∣ f_i->f_{\mid i-v\mid} f i − > f ∣ i − v ∣ ,f i − > f i + v f_i->f_{i+v} f i − > f i + v 。答案一定在 [ 0 , 9 ] [0,9] [ 0 , 9 ] 中,发现大于 72 72 7 2 的背包不优。
当做 18 18 1 8 位时,这个背包状态有 12880 12880 1 2 8 8 0 种,12880 12880 1 2 8 8 0 也是全部状态数。可以用数位 dp 套这个背包。宽搜所有转移。
设 f d e p , u , k f_{dep,u,k} f d e p , u , k 为当前剩下后 d e p dep d e p 位随便选,当前在内层自动机的位置为 u u u ,最最小值小于 k k k 的答案。T T T 组询问,差分询问 x x x ,按 x x x 从高位到低位在自动机上走,如果没有限制就加上对应的 f 值。
记录状态一个 73 73 7 3 位 01 串方面,卡哈希,可以考虑用一个 pair
记两个 long long
表示前一半后一半的值。
3.21
前缀和。反转 [ l , r ] [l,r] [ l , r ] 后 b i = a l − 1 + a r − a i ′ b_i=a_{l-1}+a_r-a_{i'} b i = a l − 1 + a r − a i ′ 。取最大的 a x a_x a x ,操作 [ 1 , x ] [1,x] [ 1 , x ] 和 ( x , 2 × n ] (x,2\times n] ( x , 2 × n ] 。b i = a x − a i ′ ≥ 0 b_i=a_x-a_{i'}\ge 0 b i = a x − a i ′ ≥ 0 。
特判不用做,考虑做一次。找到第一个小于 0 0 0 和最后一个大于 0 0 0 的区间 [ l , r ] [l,r] [ l , r ] ,翻转 [ l l , r r ] [ll,rr] [ l l , r r ] 且 l l ≤ l , r r > r ll\le l,rr>r l l ≤ l , r r > r 。max i = l r a i ≠ a l l − 1 + a r r \max_{i=l}^{r} a_i\ne a_{ll-1}+a_{rr} max i = l r a i = a l l − 1 + a r r ,找到最大的 a l l − 1 a_{ll-1} a l l − 1 和 a r r a_{rr} a r r 判断。
递增子序列以 2 x 2^x 2 x 增加,将 k k k 二进制拆分。设 t p tp t p 是 k k k 二进制最高位,先造长为 t p tp t p 的连续单调上升。加入 2 i 2^i 2 i 时,不断下降放在最开始的单调上升的后 i i i 个之前。共 60 × 2 > 90 60\times 2>90 6 0 × 2 > 9 0 。考虑将后面部分两步改为一步。如果有连续的 i i i 和 i − 1 i-1 i − 1 需要操作,直接在 i − 1 i-1 i − 1 前放大于后面放的最小值和次小值的数。
因为是一棵树,最短路径唯一,所以每次都让一个人走到底。当走 s − > t s->t s − > t ,s − > t s->t s − > t 中此时没有点,意味着起点这条路径上的人一定先于这个人走,终点在这条路径上的人一定后于这个人走。连边跑拓扑排序看有没有环。复杂度 O ( n 2 ) O(n^2) O ( n 2 ) 。倍增优化 O ( n log n ) O(n\log n) O ( n log n ) 。
3.22
曼哈顿转切比雪夫,二分答案,扫描 X 轴,set 维护 Y 轴,二分 y i − m i d y_i-mid y i − m i d ,枚举到 y i + m i d y_i+mid y i + m i d ,找到大于 k k k 个就返回。复杂度 O ( n log 2 n ) O(n\log^2n) O ( n log 2 n ) 。
如果多天走完。第一天,时间倒流,n n n 次最短路以 s s s 为终点,从 i i i 出发的最晚时间。最后一天,n n n 次最短路以 s s s 为起点,到 i i i 的最早时间。中间部分,把最后一天算出来的一天能走到的 u , v u,v u , v 连边权为 S S S 的边做弗洛伊德。复杂度 O ( n 3 ) O(n^3) O ( n 3 ) 。对于每个询问,枚举第一天去哪里,最后一天开始时在那里,复杂度 O ( q n 2 ) O(qn^2) O ( q n 2 ) 。对于已知的第一天终点和全程终点,O ( n 3 ) O(n^3) O ( n 3 ) 预处理最后一天终点,复杂度 O ( n 3 + q n ) O(n^3+qn) O ( n 3 + q n ) 。
如果一天走完,答案只可能有 m m m 次变大。算出每条边断开前 u − > v u->v u − > v 的最晚出发时间和答案,去掉被包含的部分,二分查询的时间属于那一段。复杂度 O ( n 4 log n + q log n ) O(n^4\log n+q\log n) O ( n 4 log n + q log n ) 。
3.25
对于一个点维护 b i = a i − a f a i b_i=a_i-a_{fa_i} b i = a i − a f a i 。对于操作一,等价于 b u b_u b u 加 x x x ,u u u 的子树不含 u u u 减 k k k 。对于操作二,等价于从根到 u u u 路径上的 b x b_x b x 的和。子树加,路径查,树剖加线段树。
3.26
分类讨论。如果 S S S 存在一个周期,设最小周期长为 l e n len l e n 。那么第 i i i 次操作是在 i − 1 i-1 i − 1 长度上加 ( n − l e n ) × 2 i (n-len)\times 2^i ( n − l e n ) × 2 i 。用字符串哈希判断是否存在长为 i i i 的周期,只需要判断 s [ 1 , n − i ] = s [ i + 1 , n ] s[1,n-i]=s[i+1,n] s [ 1 , n − i ] = s [ i + 1 , n ] 。
如果 S S S 不存在一个周期,找到真 border T T T ,再找到 T T T 的最小周期 T T TT T T ,发现此时答案只取决于 S S S 开头存在 n u m num n u m 个连续的 T T TT T T 。记 c n t = ∣ T ∣ ∣ T T ∣ cnt=\frac{\mid T\mid}{\mid TT\mid} c n t = ∣ T T ∣ ∣ T ∣ ,发现每次操作答案增加 min ( c n t × 2 i , n u m ) \min(cnt\times 2^i,num) min ( c n t × 2 i , n u m ) 个 T T TT T T 。模拟前 log n \log n log n 次操作后每次操作答案增加为定值,计算等差数列。
求最大的 ∑ [ v i × t + a i ≡ 0 ( m o d 2 l ) ] × w i \sum[v_i\times t+a_i\equiv 0(\mod 2^l)]\times w_i ∑ [ v i × t + a i ≡ 0 ( m o d 2 l ) ] × w i 。
t v ≡ a ( m o d 2 l ) tv\equiv a(\mod 2^l) t v ≡ a ( m o d 2 l ) 。不一定有逆元。设 t = q 2 p t=\frac{q}{2^p} t = 2 p q ,得到 t ≡ ( v 2 p 2 c ) − 1 a 2 c ( m o d 2 l − c ) t\equiv (\frac{v}{2^p2^c})^{-1}\frac{a}{2^c}(\mod 2^{l-c}) t ≡ ( 2 p 2 c v ) − 1 2 c a ( m o d 2 l − c ) 。当 v v v 中恰好有 p + c p+c p + c 个 2 2 2 且 a a a 中至少有 c c c 个 2 2 2 是有解。每次枚举 p p p ,从低到高建 trie 树,把贡献加在 q q q 对应的位置上,相当于整个子树都有加 w w w 的贡献。答案为最大的链和。
P5853 。求所有长为 n n n 的逆序对数为 k k k 的排列中 i i i 在小根笛卡尔树上的深度之和。
先 dp 满足逆序对数的排列个数。加入第 i i i 个数产生 [ 0 , i − 1 ] [0,i-1] [ 0 , i − 1 ] 对逆序对。将深度转为祖先个数。v > u v>u v > u 是 u u u 的祖先,即 v v v 处逆序对数贡献为 0 0 0 ,撤销背包即可。翻过来再做一遍。
3.27
Q6842 。w ( l , r ) = s l ⋯ s r w(l,r)=s_l\dotsb s_r w ( l , r ) = s l ⋯ s r ,其中 s i = p o p c o u n t ( i ) m o d 2 s_i=popcount(i)\mod 2 s i = p o p c o u n t ( i ) m o d 2 。S S S 为 n n n 个 w ( l i , r i ) w(l_i,r_i) w ( l i , r i ) 顺次拼接,q q q 次询问 p p p 在 S S S 中出现次数。
对 p i p_i p i 建 AC 自动机,答案为在自动机上走 S S S ,走到的每个节点加 1 1 1 ,p i p_i p i 终止节点的 fail 树子树和。
倍增拆开 S S S 。记 a ( n , i = 0 / 1 ) a(n,i=0/1) a ( n , i = 0 / 1 ) 为 w ( 0 + i 2 n , i 2 n + 2 n − 1 ) w(0+i2^n,i2^n+2^n-1) w ( 0 + i 2 n , i 2 n + 2 n − 1 ) ,有 a ( n , i ) = a ( n − 1 , i ) + a ( n − 1 , i ⊕ 1 ) a(n,i)=a(n-1,i)+a(n-1,i\oplus 1) a ( n , i ) = a ( n − 1 , i ) + a ( n − 1 , i ⊕ 1 ) 。对于 i = k 2 n i=k2^n i = k 2 n ,也有 w ( i , i + 2 m − 1 ) = a ( n , p o p c o u n t ( i ) m o d 2 ) w(i,i+2^m-1)=a(n,popcount(i)\mod 2) w ( i , i + 2 m − 1 ) = a ( n , p o p c o u n t ( i ) m o d 2 ) 。所以可以将 [ l , r ] [l,r] [ l , r ] 拆为 O ( log n ) O(\log n) O ( log n ) 个区间。
记 t o i , u , 0 / 1 to_{i,u,0/1} t o i , u , 0 / 1 表示自动机上 u u u 节点走 a ( i , 0 / 1 ) a(i,0/1) a ( i , 0 / 1 ) 到的点,c n t i , u , 0 / 1 cnt_{i,u,0/1} c n t i , u , 0 / 1 为自动机上 u u u 节点走 a ( i , 0 / 1 ) a(i,0/1) a ( i , 0 / 1 ) 的次数。分别从下一层和上一层得到。
3.28
设 d p i , j dp_{i,j} d p i , j 表示选了 i i i 个,以第 j j j 个串结尾的长度。O ( n 3 ) O(n^3) O ( n 3 ) 哈希处理转移,矩阵快速幂。
弗洛伊德算一次魔法从 i i i 到 j j j 的代价。矩阵快速幂。
对于颜色 i i i 的两个点 u , v u,v u , v ,选颜色 i i i 就路径 u → v u\to v u → v 上的所有颜色都要选。倍增优化建图,每个节点连向对应颜色,i i i 连向所有颜色为 i i i 的节点的 lca 到颜色为 i i i 的节点的链连边。缩点,入度为 0 0 0 的 scc 中有效的点的数量。
以区间最大值区间为中点,枚举短的一边,二分另一半。复杂度 O ( n log 2 n ) O(n\log^2 n) O ( n log 2 n ) 。
3.29
s k = ∑ i k a i = ∑ ( i + 1 ) k a ( i + 1 ) − ( n + 1 ) k a n + 1 + a s_k=\sum i^ka^i=\sum (i+1)^ka^(i+1)-(n+1)^ka^{n+1}+a
s k = ∑ i k a i = ∑ ( i + 1 ) k a ( i + 1 ) − ( n + 1 ) k a n + 1 + a
s k = ∑ i = 1 n ∑ j = 0 k ( k j ) i j a i + 1 − ( n + 1 ) k a n + 1 + a s_k=\sum_{i=1}^n\sum_{j=0}^k\binom{k}{j} i^ja^{i+1}-(n+1)^ka^{n+1}+a
s k = i = 1 ∑ n j = 0 ∑ k ( j k ) i j a i + 1 − ( n + 1 ) k a n + 1 + a
s k = a ∑ j = 0 k ( k j ) s j − ( n + 1 ) k a n + 1 + a s_k=a\sum_{j=0}^k\binom{k}{j}s_j-(n+1)^ka^{n+1}+a
s k = a j = 0 ∑ k ( j k ) s j − ( n + 1 ) k a n + 1 + a
s k = ∑ i k = ∑ ( i + 1 ) k − ( n + 1 ) k + 1 s_k=\sum i^k=\sum (i+1)^k-(n+1)^k+1
s k = ∑ i k = ∑ ( i + 1 ) k − ( n + 1 ) k + 1
s k = ∑ i = 1 n ∑ j = 0 k ( k j ) i j − ( n + 1 ) k + 1 s_k=\sum_{i=1}^n\sum_{j=0}^k\binom{k}{j} i^j-(n+1)^k+1
s k = i = 1 ∑ n j = 0 ∑ k ( j k ) i j − ( n + 1 ) k + 1
0 = ∑ j = 0 k − 1 ( k j ) s j − ( n + 1 ) k + 1 0=\sum_{j=0}^{k-1}\binom{k}{j}s_j-(n+1)^k+1
0 = j = 0 ∑ k − 1 ( j k ) s j − ( n + 1 ) k + 1
( k + 1 k ) s k = ( n + 1 ) k + 1 − ∑ j = 0 k − 1 ( k + 1 j ) s j − 1 \binom{k+1}{k}s_k=(n+1)^{k+1}-\sum_{j=0}^{k-1}\binom{k+1}{j}s_j-1
( k k + 1 ) s k = ( n + 1 ) k + 1 − j = 0 ∑ k − 1 ( j k + 1 ) s j − 1
选一些行异或,如果不是全零的话答案为 2 m − 1 2^{m-1} 2 m − 1 。只需要求若干行异或后全零的方案数,将一行看作大小为 m m m 的数,bitset 维护做线性基。
移动骨牌相当于移动空格,按黑白分开,可以移动的连有向边,可以证明这是两组森林。去掉一个骨牌两个空格可以移动到两个子树任意位置,但有重复。用 dfn 序记录一段区间,扫描线算矩阵面积并。
a + b − a a n d b = a o r b a+b-a and b=a or b a + b − a a n d b = a o r b 。转换为最小 and 和。每一位单独贡献。01 序列的 and 相当于乘法。对每个循环位移长度 i i i 记 a n s i ans_i a n s i 。
把 b 复制一遍。a n s j = ∑ k ∑ i a i , k × b i + j , k ans_j=\sum_k \sum_i a_{i,k}\times b_{i+j,k} a n s j = ∑ k ∑ i a i , k × b i + j , k 。差卷积。
3.30
P3006 。以 1 1 1 为根的有根树,每个节点有一定数量的奶牛,每单位时间每条边限制流量,奶牛单位时间内可以移动多步,多组询问一定时间内能到达根的最多的奶牛个数。
计算每个点人数减少速度。当一个点送完人后,再有人从下方送来直接往上转,所以可以在并查集上将 u u u 与 f a u fa_u f a u 合并。从小到大处理,知道询问属于哪个段即可。
若 min i = l r a i ≤ r − l + 1 ≤ max i = l r a r \min_{i=l}^r a_i\leq r-l+1\leq \max_{i=l}^r a_r min i = l r a i ≤ r − l + 1 ≤ max i = l r a r ,则 [ l , r ] [l,r] [ l , r ] 符合条件。求有多少种合法划分方案数。
f i + 1 = ∑ f j × [ [ j , i ] 合 法 ] f_{i+1}=\sum f_j\times [[j,i] 合法] f i + 1 = ∑ f j × [ [ j , i ] 合 法 ] 。容斥,等于所有减不满足 min 减不满足 max 加两个都不满足。考虑合法区间的矩形面积并,对于每个 i i i ,满足 min 的区间形如一个矩形减一个平行于 y = x y=x y = x 的三角形。三角形无法扫面线,但是可以看成以区间最小值分治然后枚举短的一边。所以把 O ( n ) O(n) O ( n ) 个矩形减三角形拆成 O ( n log n ) O(n\log n) O ( n log n ) 个矩形。维护区间最小值和最小值对应的 f 值,扫描线更新 f。