◊ \Large{\color{red}\Diamond} ◊ 为重点转换步骤。
感觉像是几个套路拼在一起的缝合题目,但我好像都无法快速识别。
先将这条数轴拉成一个平面图,x 轴是数轴,y 轴是时间,有左右边界 x = 0 x=0 x = 0 和 x = m x=m x = m ,那么 Jerry 需要从 ( 0 , x ) (0,x) ( 0 , x ) 到 ( + inf , x ′ ) (+\inf,x') ( + inf , x ′ ) ,而 Tom 需要通过若干条 ( a i , t i ) → ( b i , t i + ∣ b i − a i ∣ ) (a_i,t_i) \to (b_i,t_i+|b_i-a_i|) ( a i , t i ) → ( b i , t i + ∣ b i − a i ∣ ) 的线段将这个平面图割开使 Jerry 无法通过。◊ \Large{\color{red}\Diamond} ◊
Tom 的线段都是斜率为 ± 1 \pm 1 ± 1 的,Jerry 移动的斜率为 [ − 1 , 1 ] [-1,1] [ − 1 , 1 ] ,考虑将这个图顺时针旋转 45 ° 45\degree 4 5 ° 并扩大 2 \sqrt2 2 倍(即将点 ( x , y ) → ( x + y , y − x ) (x,y) \to (x+y,y-x) ( x , y ) → ( x + y , y − x ) ),左右边界变成 y = x y=x y = x 和 y = x − 2 m y=x-2m y = x − 2 m 。机器猫变成使用水平和竖直的线段将左右边界断开,有两种方式:
一条水平和竖直线段直接相交,阻止 Jerry 通过。
因为 Jerry 旋转后只能向右上(包含右和上)移动,所以可以使用两条不相交的线将 Jerry 的 x/y 坐标限制在一个区间中(如下图中红色线段是机器猫的不相交限制线段,Jerry 可以走绿色的路径,但到达了 ? 后就无法继续走)。

考虑刻画这样的限制,对于每条竖线,令上面的点是 in,下面的是 out,横线左边的是 in,右边的是 out。可以发现对于两种方式都能用以下方式刻画:i n x → o u t x in_x \to out_x i n x → o u t x ,对于满足 i n x in_x i n x 在 o u t y out_y o u t y 左上角的点连接 o u t y → i n x out_y \to in_x o u t y → i n x 。◊ \Large{\color{red}\Diamond} ◊ 若最后能从在 y = x y=x y = x 的点到达 y = x − 2 m y=x-2m y = x − 2 m 的点,则经过的边的长度和就是 k = 1 k=1 k = 1 时的答案。
继续拓展到 k > 1 k>1 k > 1 的情况,要选出 k k k 条不相交的,可以构建费用流模型 ◊ \Large{\color{red}\Diamond} ◊
将 S S S 连向所有在 y = x y=x y = x 上的点,容量为 1 1 1 ,费用为 0 0 0 。
i n x → o u t x in_x\to out_x i n x → o u t x 容量为 1 1 1 ,费用为 w x w_x w x 。
o u t y → i n x out_y\to in_x o u t y → i n x 容量为 + ∞ / k +\infty / k + ∞ / k ,费用为 0 0 0 。
将所有在 y = x − 2 m y=x-2m y = x − 2 m 上的点连向 T T T ,容量为 1 1 1 ,费用为 0 0 0 。
答案就是这个图在流量为 k k k 时的最小费用。注意 1 1 1 和 4 4 4 的容量不是 + ∞ / k +\infty/k + ∞ / k 是因为若在这个点重合时,Jerry 直接走到这个点只需要扣 1 1 1 的血量,而 3 3 3 是因为这条边只是虚构的边,实际画一下可以发现 Jerry 至少会扣两滴血量。
但是现在还是有 O ( n 2 ) \mathcal O(n^2) O ( n 2 ) 条边,考虑优化建图,每个 o u t out o u t 向左上角的 i n in i n 连边,显然是一个二维偏序关系,使用主席树/可持久化树状数组优化即可。因为 f l o w flow f l o w 很小,使用原始对偶求费用流最后复杂度为 O ( n k log 2 n ) \mathcal O(nk\log^2n) O ( n k log 2 n ) 。
好像应该之前讲过,但当时不会轮廓线 dp 就没改。
列出一个 m × n m\times n m × n 的矩阵,其中 G i , j G_{i,j} G i , j 表示第 i i i 天机场 j j j 剩余的行李数量。不难建出网络流模型:
( i , j ) → ( i + 1 , j − 1 ) (i,j) \to (i+1,j-1) ( i , j ) → ( i + 1 , j − 1 ) ,容量为 a i , j a_{i,j} a i , j 。
( i , j ) → ( i + 1 , j ) (i,j)\to (i+1,j) ( i , j ) → ( i + 1 , j ) ,容量为 b i , j b_{i,j} b i , j 。
( i , j ) → ( i + 1 , j + 1 ) (i,j)\to (i+1,j+1) ( i , j ) → ( i + 1 , j + 1 ) ,容量为 c i , j c_{i,j} c i , j 。
S → ( 1 , i ) S\to(1,i) S → ( 1 , i ) ,容量为 s i s_i s i 。
( k , i ) → T (k,i)\to T ( k , i ) → T ,容量为 + ∞ +\infty + ∞ 。
第 k k k 天的答案就是最大流,直接做复杂度是 O ( n m 3 ) \mathcal O(nm^3) O ( n m 3 ) ,无法通过。
考虑 n n n 很小时的做法,因为最大流 = 最小割,所以可以考虑维护 n n n 个点到 S S S 的连通性来计算最小割。记 f i , j , S , 0 / 1 f_{i,j,S,0/1} f i , j , S , 0 / 1 表示前 i i i 行,目前到达 j j j ,( i , [ 1 , j ) (i,[1,j) ( i , [ 1 , j ) 和 ( i − 1 , [ j , n ] ) (i-1,[j,n]) ( i − 1 , [ j , n ] ) 的连通状态为 S S S ,( i , j ) (i,j) ( i , j ) 是否连通 S S S 的最小割。用轮廓线 dp 不难做到 O ( n m 2 n ) \mathcal O(nm2^n) O ( n m 2 n ) 。
有结论:∑ i = 1 m ∑ j = 1 n [ c i , j > 0 ] = O ( L 4 3 ) \sum_{i=1}^m\sum_{j=1}^n [c_{i,j}>0]=\mathcal O(L^\frac43) ∑ i = 1 m ∑ j = 1 n [ c i , j > 0 ] = O ( L 3 4 ) ,其中 c i , j c_{i,j} c i , j 表示 s j s_j s j 匹配 t i t_i t i 的次数。证明:
所以若将 t i t_i t i 放入 s s s 构建的 AC 自动机中跑,只在成功匹配的 t t t 中计数是能够接受的。建出一棵 e n d end e n d 树,f a x → x fa_x \to x f a x → x 表示 e n d p o s ( s f a x ) endpos(s_{fa_x}) e n d p o s ( s f a x ) 是 e n d p o s ( s x ) endpos(s_x) e n d p o s ( s x ) 在 fail 树上最深的终点的祖先。对于每次询问 t t t ,将 t t t 在 AC 自动机上匹配的 e n d p o s endpos e n d p o s 集合 S S S 的所有点在 e n d end e n d 树中暴力 dfs 子树并贡献答案即可,复杂度为 O ( L 4 3 ) \mathcal O(L^\frac43) O ( L 3 4 ) 。
直接暴力 dfs 常数比较大,可以类似按照拓扑序,从原来加边的地方改成维护从下到上的链,常数较小可以通过。
最长公共子串考虑 SA。不难发现答案就是求 max i = l r min ( r − i + 1 , l c p ( s u f S i , s u f T j ) ) \displaystyle\max_{i=l}^r\min(r-i+1,lcp(sufS_i,sufT_j)) i = l max r min ( r − i + 1 , l c p ( s u f S i , s u f T j ) ) 。先把 S + # + T S+\#+T S + # + T 拼起来,然后对于固定的 i i i ,l c p ( s u f S i , s u f T j ) lcp(sufS_i,sufT_j) l c p ( s u f S i , s u f T j ) 的最大值就是找 r k j rk_j r k j 距离 r k i rk_i r k i 最近的属于 T T T 的 j j j ,只用找前面和后面即可。然后处理对 r − i + 1 r-i+1 r − i + 1 的限制,可以直接二分答案 x x x ,然后在 [ l , r − x + 1 ] [l,r-x+1] [ l , r − x + 1 ] 中寻找最大的 l c p ( s u f S i , s u f T j ) lcp(sufS_i,sufT_j) l c p ( s u f S i , s u f T j ) 即可。复杂度为 O ( n log n + q log n ) \mathcal O(n\log n+q\log n) O ( n log n + q log n ) 。
OGF 入门题
给定 n n n 和 m m m ,你需要计数长度为 n n n 的序列,每个数是 1 , 2 , 3 , 4 1,2,3,4 1 , 2 , 3 , 4 之一,满足 1 1 1 的数量减 2 2 2 的数量等于 m m m 。
f i , j = ∑ f i − 1 , j − 1 + f i − 1 , j + 1 + 2 f i − 1 , j , f 0 , i = 0 F i ( x ) = F i − 1 ( x ) ( x + 1 x + 2 ) F n ( x ) = ( x + 1 x + 2 ) n a n s = [ m ] ( x 2 + 2 x + 1 x ) n a n s = [ n + m ] ( x + 1 ) 2 n a n s = [ n + m ] ∑ i = 0 2 n ( 2 n i ) x i a n s = ( 2 n n + m ) f_{i,j}=\sum f_{i-1,j-1}+f_{i-1,j+1}+2f_{i-1,j},f_{0,i}=0 \\
F_i(x)=F_{i-1}(x)(x+\frac 1x+2) \\
F_n(x)=(x+\frac 1x+2)^n\\
ans=[m](\frac{x^2+2x+1}x)^n\\
ans=[n+m](x+1)^{2n} \\
ans=[n+m]\sum_{i=0}^{2n} \binom{2n}i x^i\\
ans=\binom{2n}{n+m}
f i , j = ∑ f i − 1 , j − 1 + f i − 1 , j + 1 + 2 f i − 1 , j , f 0 , i = 0 F i ( x ) = F i − 1 ( x ) ( x + x 1 + 2 ) F n ( x ) = ( x + x 1 + 2 ) n a n s = [ m ] ( x x 2 + 2 x + 1 ) n a n s = [ n + m ] ( x + 1 ) 2 n a n s = [ n + m ] i = 0 ∑ 2 n ( i 2 n ) x i a n s = ( n + m 2 n )
考虑拆开 v a l ( T ) val(T) v a l ( T ) :
v a l ( T ) = ( ∑ i = 1 n − 1 w i ) × gcd ( w 1 , w 2 , … , w n − 1 ) = ( ∑ i = 1 n − 1 w i ) × ∑ d ∣ w 1 , d ∣ w 2 , … d ∣ w n − 1 φ ( d ) = ∑ d φ ( d ) [ d ∣ w 1 ∧ ⋯ ∧ d ∣ w n − 1 ] ∑ i = 1 n − 1 w i val(T)=(\sum_{i=1}^{n-1}w_i)\times \gcd(w_1,w_2,\dots,w_{n-1})\\
=(\sum_{i=1}^{n-1}w_i)\times \sum_{d|w_1,d|w_2,\dots d|w_{n-1}} \varphi(d) \\
=\sum_d \varphi(d)[d|w_1\wedge\dots\wedge d|w_{n-1}]\sum_{i=1}^{n-1}w_i\\
v a l ( T ) = ( i = 1 ∑ n − 1 w i ) × g cd( w 1 , w 2 , … , w n − 1 ) = ( i = 1 ∑ n − 1 w i ) × d ∣ w 1 , d ∣ w 2 , … d ∣ w n − 1 ∑ φ ( d ) = d ∑ φ ( d ) [ d ∣ w 1 ∧ ⋯ ∧ d ∣ w n − 1 ] i = 1 ∑ n − 1 w i
将 d d d 的倍数的边拉出来做 Matrix-Tree 即可,但是还有问题就是矩阵树定理求解的是 w i w_i w i 的积的和,但我们需要求 w i w_i w i 的和。实际上 Matrix-Tree 的权值 w i w_i w i 不一定是常数,还可以是函数,所以将 w i ′ = w i x + 1 w'_i=w_ix+1 w i ′ = w i x + 1 ,这样求出来的函数的一次项就是答案了◊ \Large{\color{red}\Diamond} ◊ 。做的过程只需要记录一次项和常数项即可,复杂度为 O ( V n 3 ) \mathcal O(Vn^3) O ( V n 3 ) ,实际上准确的上界是 O ( n max d ( V ) n 3 ) \mathcal O(n\max d(V)n^3) O ( n max d ( V ) n 3 ) ,可以通过。
精妙的转化,积累一下套路。
首先不难发现可以在 max a i \max a_i max a i 处断开,完成断环成链,移动至 a 1 = max a i a_1=\max a_i a 1 = max a i 。令 f i f_i f i 表示目前在 i i i 的期望收益,不难列出方程f i = max ( a i , f i − 1 + f i + 1 2 − b i ) f_i=\max(a_i,\frac{f_{i-1}+f_{i+1}}2-b_i) f i = max ( a i , 2 f i − 1 + f i + 1 − b i ) 。尝试将 b i b_i b i 提出来做常数项,构造 g i = f i + d i ◊ g_i=f_i+d_i\Large{\color{red}\Diamond} g i = f i + d i ◊ 。
g i = max ( a i , f i − 1 + f i + 1 2 − b i ) + d i g i = max ( a i + d i , g i − 1 − d i − 1 + g i + 1 − d i + 1 2 − b i + d i ) g i = max ( a i + d i , g i − 1 + g i + 1 2 − d i − 1 + d i + 1 − 2 d i + 2 b i 2 ) g_i=\max(a_i,\frac{f_{i-1}+f_{i+1}}2-b_i)+d_i \\
g_i=\max(a_i+d_i,\frac{g_{i-1}-d_{i-1}+g_{i+1}-d_{i+1}}2-b_i+d_i)\\
g_i=\max(a_i+d_i,\frac{g_{i-1}+g_{i+1}}2-\frac{d_{i-1}+d_{i+1}-2d_i+2b_i}2)\\
g i = max ( a i , 2 f i − 1 + f i + 1 − b i ) + d i g i = max ( a i + d i , 2 g i − 1 − d i − 1 + g i + 1 − d i + 1 − b i + d i ) g i = max ( a i + d i , 2 g i − 1 + g i + 1 − 2 d i − 1 + d i + 1 − 2 d i + 2 b i )
因为要让 max \max max 后半部分的常数剔除,所以构造 d i − 1 + d i + 1 − 2 d i + 2 b i = 0 d_{i-1}+d_{i+1}-2d_i+2b_i=0 d i − 1 + d i + 1 − 2 d i + 2 b i = 0 ,即 d i = − 2 b i − 1 + 2 d i − 1 − d i − 2 d_i=-2b_{i-1}+2d_{i-1}-d_{i-2} d i = − 2 b i − 1 + 2 d i − 1 − d i − 2 ,初始项随便设成 d 0 = d 1 = 0 d_0=d_1=0 d 0 = d 1 = 0 即可。
g i = max ( a i + d i , g i − 1 + g i + 1 2 ) g_i=\max(a_i+d_i,\frac{g_{i-1}+g_{i+1}}2)
g i = max ( a i + d i , 2 g i − 1 + g i + 1 )
a i + d i a_i+d_i a i + d i 已经是常数了,考虑后面是一个类似取中点的形式,若将点 ( i , g i ) (i,g_i) ( i , g i ) 放到坐标系中,取后面的部分代表了 i − 1 , i , i + 1 i-1,i,i+1 i − 1 , i , i + 1 三点共线。但加上和常数取 max \max max 时,发现会将 i i i 的点往上提,会形成一个类似凸包的形态◊ \Large{\color{red}\Diamond} ◊ 。具体证明大概是 2 g i ≥ g i − 1 + g i + 1 2g_i\ge g_{i-1}+g_{i+1} 2 g i ≥ g i − 1 + g i + 1 ,即 g i − g i − 1 ≥ g i + 1 − g i g_i-g_{i-1}\ge g_{i+1}-g_i g i − g i − 1 ≥ g i + 1 − g i ,所以会形成一个下凸壳,注意有 a n + 1 = a 1 a_{n+1}=a_1 a n + 1 = a 1 。
好像依旧不太会 Slope Trick /ll
记 S i S_i S i 表示在 i i i 时刻的烟花的位置集合,f i , j f_{i,j} f i , j 表示前 i i i 时刻在 j j j 的答案,不难列出 f i , j = min k = 1 j f i − 1 , k + ∑ x ∈ S i ∣ j − x ∣ f_{i,j}=\min_{k=1}^j f_{i-1,k}+\sum_{x\in S_i}|j-x| f i , j = min k = 1 j f i − 1 , k + ∑ x ∈ S i ∣ j − x ∣ 。后面的 ∑ \sum ∑ 部分显然是下凸函数,然后可以归纳证明 F i ( x ) = f i , j F_i(x)=f_{i,j} F i ( x ) = f i , j 也是下凸函数,考虑使用 Slope Trick。◊ \Large{\color{red}\Diamond} ◊
使用堆维护斜率拐点(经过堆中的拐点时斜率会 − 1 -1 − 1 ),因为需要做前缀取 min \min min ,即将所有的斜率和 0 0 0 取 min \min min ,考虑倒着维护从右往左的拐点。直接记录 k , b k,b k , b 表示在 + ∞ +\infty + ∞ 处的 F ( x ) = k x + b F(x)=kx+b F ( x ) = k x + b ,当加入 ∣ x − p ∣ |x-p| ∣ x − p ∣ 函数时,在 x ≥ p x\ge p x ≥ p 时会 k ← k + 1 , b ← b − p k\gets k+1,b\gets b-p k ← k + 1 , b ← b − p ,到了 p p p 处时还原成 p − x p-x p − x ,即设置两个在 p p p 处的拐点时 k ← k − 2 , b ← b + 2 p k\gets k-2,b\gets b+2p k ← k − 2 , b ← b + 2 p 。
做完了加凸函数,然后再前缀取 min \min min ,直接从右往左走直到 k ≤ 0 k\le 0 k ≤ 0 时即可。复杂度 O ( n log n ) \mathcal O(n\log n) O ( n log n ) 。代码很好写,但理解了挺久的。
a n s = ∑ i = 1 n ∑ j = 1 m φ ( i j ) = ∑ i = 1 n ∑ j = 1 m φ ( i ) φ ( j ) gcd ( i , j ) φ ( gcd ( i , j ) ) = ∑ d = 1 min ( n , m ) d φ ( d ) ∑ i = 1 n / d ∑ j = 1 m / d [ gcd ( i , j ) = 1 ] φ ( i d ) φ ( j d ) = ∑ d = 1 min ( n , m ) d φ ( d ) ∑ i = 1 n / d ∑ j = 1 m / d ∑ p ∣ i , p ∣ j μ ( p ) φ ( i d ) φ ( j d ) = ∑ d = 1 min ( n , m ) d φ ( d ) ∑ p = 1 min ( n , m ) μ ( p ) ∑ i = 1 n / d p ∑ j = 1 m / d p φ ( i d p ) φ ( j d p ) ans=\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\\
=\sum_{i=1}^n\sum_{j=1}^m\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\\
=\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} [\gcd(i,j)=1]\varphi(id)\varphi(jd) \\
=\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} \sum_{p|i,p|j}\mu(p)\varphi(id)\varphi(jd) \\
=\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{p=1}^{\min(n,m)}\mu(p)\sum_{i=1}^{n/dp}\sum_{j=1}^{m/dp} \varphi(idp)\varphi(jdp) \\
a n s = i = 1 ∑ n j = 1 ∑ m φ ( i j ) = i = 1 ∑ n j = 1 ∑ m φ ( g cd( i , j ) ) φ ( i ) φ ( j ) g cd( i , j ) = d = 1 ∑ min ( n , m ) φ ( d ) d i = 1 ∑ n / d j = 1 ∑ m / d [ g cd( i , j ) = 1 ] φ ( i d ) φ ( j d ) = d = 1 ∑ min ( n , m ) φ ( d ) d i = 1 ∑ n / d j = 1 ∑ m / d p ∣ i , p ∣ j ∑ μ ( p ) φ ( i d ) φ ( j d ) = d = 1 ∑ min ( n , m ) φ ( d ) d p = 1 ∑ min ( n , m ) μ ( p ) i = 1 ∑ n / d p j = 1 ∑ m / d p φ ( i d p ) φ ( j d p )
预处理 f n = ∑ i j = n i φ ( i ) μ ( j ) f_n=\sum_{ij=n}\frac{i}{\varphi(i)}\mu(j) f n = ∑ i j = n φ ( i ) i μ ( j ) ,预处理复杂度为 O ( n log n ) \mathcal O(n\log n) O ( n log n ) 。
a n s = ∑ x = 1 min ( n , m ) f x ( ∑ i = 1 ⌊ n x ⌋ φ ( i x ) ) ( ∑ j = 1 ⌊ m x ⌋ φ ( j x ) ) ans=\sum_{x=1}^{\min(n,m)} f_x(\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\varphi(ix))(\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}\varphi(jx))
a n s = x = 1 ∑ min ( n , m ) f x ( i = 1 ∑ ⌊ x n ⌋ φ ( i x ) ) ( j = 1 ∑ ⌊ x m ⌋ φ ( j x ) )
预处理 g n , x = ∑ i = 1 x φ ( i n ) g_{n,x}=\sum_{i=1}^{x}\varphi(in) g n , x = ∑ i = 1 x φ ( i n ) ,复杂度还是 O ( n log n ) \mathcal O(n\log n) O ( n log n ) 。
a n s = ∑ x = 1 min ( n , m ) f x g x , ⌊ n x ⌋ g x , ⌊ m x ⌋ ans=\sum_{x=1}^{\min(n,m)} f_xg_{x,\lfloor\frac nx\rfloor}g_{x,\lfloor\frac mx\rfloor}
a n s = x = 1 ∑ min ( n , m ) f x g x , ⌊ x n ⌋ g x , ⌊ x m ⌋
现在 a n s ans a n s 的形式还是对于 x ∈ [ 1 , min ( n , m ) ] x\in[1,\min(n,m)] x ∈ [ 1 , min ( n , m ) ] 进行对位乘后求和,不太能直接优化,考虑根号分治。
对于 x ≤ B x\le B x ≤ B 时暴力跑上面的式子,复杂度 O ( B ) \mathcal O(B) O ( B ) 。对于 x > B x>B x > B ,预处理 h n , i , j = ∑ x = 1 n f x g x , i g x , j h_{n,i,j}=\sum_{x=1}^n f_xg_{x,i}g_{x,j} h n , i , j = ∑ x = 1 n f x g x , i g x , j ,再对第一维做前缀和(即h n , i , j ′ = ∑ k ≤ n h k , i , j h'_{n,i,j}=\sum_{k\le n} h_{k,i,j} h n , i , j ′ = ∑ k ≤ n h k , i , j )。对 n n n 和 m m m 做整除分块,有序对 ( ⌊ n x ⌋ , ⌊ m x ⌋ ) (\lfloor\frac{n}{x}\rfloor,\lfloor\frac{m}{x}\rfloor) ( ⌊ x n ⌋ , ⌊ x m ⌋ ) 只有 O ( n + m ) \mathcal O(\sqrt n+\sqrt m) O ( n + m ) 种,复杂度为 O ( n 2 B + T n ) \mathcal O({\color{red}\frac{n^2}B}+T\sqrt n) O ( B n 2 + T n ) 。总复杂度为 O ( n 2 B + T B + T n ) \mathcal O(\frac{n^2} B+TB+T\sqrt n) O ( B n 2 + T B + T n ) ,平衡取 B = n 2 T B=\sqrt\frac{n^2}{T} B = T n 2 ,视 n , T n,T n , T 同阶时,做到 O ( n n ) \mathcal O(n\sqrt n) O ( n n ) 。
解释一下上面红色的为什么是 n 2 B \frac{n^2}B B n 2 :
∫ B n n 2 i 2 d i = n 2 B − n \int_B^n \frac{n^2}{i^2}\,di=\frac{n^2}{B}-n
∫ B n i 2 n 2 d i = B n 2 − n
空间复杂度也是 O ( n 2 B ) \mathcal O(\frac{n^2}B) O ( B n 2 ) 的,再 LOJ 需要将 B B B 稍微开大来卡空间。
求 s f ( n ) = ∑ i = 1 n f ( i ) sf(n)=\sum_{i=1}^n f(i) s f ( n ) = ∑ i = 1 n f ( i ) ,其中 f f f 是积性函数。
构造积性函数 g g g ,有
∑ i = 1 n ( f ∗ g ) ( i ) = ∑ i = 1 n ∑ d ∣ i f ( d ) g ( i d ) = ∑ d = 1 n g ( d ) ∑ i = 1 ⌊ n d ⌋ f ( i ) = ∑ d = 1 n g ( d ) s f ( ⌊ n d ⌋ ) \sum_{i=1}^n(f*g)(i)=\sum_{i=1}^n\sum_{d|i} f(d)g(\frac id) \\
=\sum_{d=1}^n g(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}f(i)\\
=\sum_{d=1}^ng(d)sf(\lfloor\frac{n}d\rfloor)
i = 1 ∑ n ( f ∗ g ) ( i ) = i = 1 ∑ n d ∣ i ∑ f ( d ) g ( d i ) = d = 1 ∑ n g ( d ) i = 1 ∑ ⌊ d n ⌋ f ( i ) = d = 1 ∑ n g ( d ) s f ( ⌊ d n ⌋ )
移项可以得到:
g ( 1 ) s f ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) − ∑ d = 2 n g ( d ) s f ( ⌊ n d ⌋ ) g(1)sf(n)=\sum_{i=1}^n (f*g)(i)-\sum_{d=2}^n g(d)sf(\lfloor\frac nd\rfloor)
g ( 1 ) s f ( n ) = i = 1 ∑ n ( f ∗ g ) ( i ) − d = 2 ∑ n g ( d ) s f ( ⌊ d n ⌋ )
若能快速求出 f ∗ g f*g f ∗ g 和 g g g 的前缀和,就可以使用整除分块加速求出 s f ( n ) sf(n) s f ( n ) 。结论有,当能 O ( 1 ) \mathcal O(1) O ( 1 ) 求出 f ∗ g f*g f ∗ g 和 g g g 的前缀和时,若提前使用线性筛算出前面的 s f ( n ) sf(n) s f ( n ) ,可以做到 O ( n 2 3 ) \mathcal O(n^\frac 23) O ( n 3 2 ) ,不预处理复杂度是 O ( n 3 4 ) \mathcal O(n^\frac 34) O ( n 4 3 ) 。
当 f = φ f=\varphi f = φ 时,有 φ ∗ 1 = i d \varphi*1=id φ ∗ 1 = i d ,g = 1 g=1 g = 1 和 f ∗ g = i d f*g=id f ∗ g = i d 的前缀和都能快速求。
当 f = μ f=\mu f = μ 时,有 μ ∗ 1 = ϵ \mu*1=\epsilon μ ∗ 1 = ϵ ,g = 1 g=1 g = 1 ,f ∗ g = ϵ f*g=\epsilon f ∗ g = ϵ 。
当 f ( i ) = φ ( i ) i f(i)=\varphi(i)i f ( i ) = φ ( i ) i ,有 h ( i ) = ( f ∗ i d ) ( i ) = ∑ d ∣ i φ ( d ) d i d = i ∑ d ∣ i φ ( d ) = i 2 h(i)=(f*id)(i)=\sum_{d|i}\varphi(d)d\frac{i}{d}=i\sum_{d|i}\varphi(d)=i^2 h ( i ) = ( f ∗ i d ) ( i ) = ∑ d ∣ i φ ( d ) d d i = i ∑ d ∣ i φ ( d ) = i 2 。g = i d g=id g = i d ,f ∗ g = h f*g=h f ∗ g = h 。
[P4482 [BJWC2018] Border 的四种求法](P4482 [BJWC2018] Border 的四种求法)
给定字符串 s s s ,q q q 次询问求 s [ l , r ] s[l,r] s [ l , r ] 的 border 长度。
将 border 拆成前缀的后缀形式,答案就是最大的 x x x 满足 x ∈ [ 0 , r − l ] , l c s ( p r e l + x − 1 , p r e r ) ≥ x x\in [0,r-l],lcs(pre_{l+x-1},pre_r)\ge x x ∈ [ 0 , r − l ] , l c s ( p r e l + x − 1 , p r e r ) ≥ x 。建出后缀树后有性质 l c s ( p r e x , p r e y ) = l e n L C A ( e n x , e n y ) lcs(pre_x,pre_y)=len_{LCA(en_x,en_y)} l c s ( p r e x , p r e y ) = l e n L C A ( e n x , e n y ) ,其中 e n i en_i e n i 表示 SAM 中以 i i i 结尾的节点。所以题目就是要求 e n r en_r e n r 的祖先 x x x 的子树中满足 i d p ∈ [ l , r ) , i d p − l e n x + 1 ≤ l id_p\in[l,r),id_p-len_x+1\le l i d p ∈ [ l , r ) , i d p − l e n x + 1 ≤ l (其中可能将 LCA 算得更高,但是一定不优,所以没问题),其中 i d e n i = i id_{en_{i}}=i i d e n i = i 。这个不满足单调性,直接做不好做,考虑使用树剖将询问放到 log n \log n log n 个重链后离线处理。
对于一条重链,需要处理下面两种询问:
对于一个前缀 i ∈ t p u ⇝ f a u i\in tp_u\leadsto fa_u i ∈ t p u ⇝ f a u ,求最大的 x ∈ e n d p o s i x\in endpos_i x ∈ e n d p o s i ,x ∈ [ l , r ) x\in [l,r) x ∈ [ l , r ) ,x − l e n i + 1 ≤ l x-len_i+1\le l x − l e n i + 1 ≤ l 。
对于一个后缀 i ∈ u ⇝ l s t u i\in u\leadsto lst_u i ∈ u ⇝ l s t u ,求最大的 x ∈ e n d p o s i x\in endpos_i x ∈ e n d p o s i ,x ∈ [ l , r ) x\in[l,r) x ∈ [ l , r ) ,x − l e n u + 1 ≤ l x-len_u+1\le l x − l e n u + 1 ≤ l ,即 x ∈ [ l , min ( l + l e n u − 1 , r − 1 ) ] x\in[l,\min(l+len_u-1,r-1)] x ∈ [ l , min ( l + l e n u − 1 , r − 1 ) ] 。
其中 e n d p o s i endpos_i e n d p o s i 表示 i i i 子树中所有 e n v en_v e n v 的集合,实际上可以只用枚举轻子树的,因为重子树会在下面算到。处理时直接遍历重链上 i i i 的所有轻子树的总复杂度为 O ( n log n ) \mathcal O(n\log n) O ( n log n ) 的◊ \Large{\color{red}\Diamond} ◊ ,证明考虑树剖复杂度证明。对于 2 询问直接用 set 存下 e n d p o s endpos e n d p o s 后lower_bound即可。对于 1 操作需要建线段树,维护 x − l e n i + 1 x-len_i+1 x − l e n i + 1 的区间最小值,询问时在 [ l , r ) [l,r) [ l , r ) 线段树上二分◊ \Large{\color{red}\Diamond} ◊ 。总复杂度为 O ( n log 2 n + q log 2 n ) \mathcal O(n\log^2n+q\log^2n) O ( n log 2 n + q log 2 n ) 。
ZROJ
什么脑电波推式子题?
不难想到枚举将哪一个)换成(后计算后面的方案数,根据路径相关计数方法,得到的答案(实际上还要加上前缀合法串的数量,简单这里不考虑)就是:
a n s = ∑ s i = ) ∑ j = x i + 1 n / 2 ( 2 j − i j − x i − 1 ) − ( 2 j − i j − x i − 2 ) = ∑ s i = ) ∑ j = 0 n / 2 − x i − 1 ( 2 j + 2 x i + 2 − i j ) − ( 2 j + 2 x i + 2 − i j − 1 ) ans=\sum_{s_i=)}\sum_{j=x_i+1}^{n/2}\binom{2j-i}{j-x_i-1}-\binom{2j-i}{j-x_i-2} \\
=\sum_{s_i=)}\sum_{j=0}^{n/2-x_i-1}\binom{2j+2x_i+2-i}{j}-\binom{2j+2x_i+2-i}{j-1} \\
a n s = s i = ) ∑ j = x i + 1 ∑ n / 2 ( j − x i − 1 2 j − i ) − ( j − x i − 2 2 j − i ) = s i = ) ∑ j = 0 ∑ n / 2 − x i − 1 ( j 2 j + 2 x i + 2 − i ) − ( j − 1 2 j + 2 x i + 2 − i )
其中 x i x_i x i 表示前 i i i 个位置的(数量,令 c i = 2 x i + 2 − i c_i=2x_i+2-i c i = 2 x i + 2 − i 。将组合数提取出来设成 f f f :
f ( a , b ) = ∑ i = 0 b ( 2 i + a i ) a n s = ∑ s i = ) f ( c i , n 2 − x i − 1 ) − f ( c i + 2 , n 2 − x i − 2 ) f(a,b)=\sum_{i=0}^b \binom{2i+a}{i}\\
ans=\sum_{s_i=)}f(c_i,\frac n2-x_i-1)-f(c_i+2,\frac{n}2-x_i-2)
f ( a , b ) = i = 0 ∑ b ( i 2 i + a ) a n s = s i = ) ∑ f ( c i , 2 n − x i − 1 ) − f ( c i + 2 , 2 n − x i − 2 )
通过对 f f f 做差分,可以发现◊ \Large{\color{red}\Diamond} ◊ :
f ( a , b ) − f ( a − 1 , b ) = ∑ i = 0 b ( 2 i + a i ) − ( 2 i + a − 1 i ) = ∑ i = 0 b ( 2 i + a − 1 i − 1 ) = ∑ i = 0 b − 1 ( 2 i + a + 1 i ) = f ( a + 1 , b − 1 ) f ( a , b ) = f ( a + 1 , b − 1 ) + f ( a − 1 , b ) f ( a − 1 , b ) , f ( a , b ) → f ( a + 1 , b − 1 ) , f ( a , b ) → f ( a , b ) , f ( a + 1 , b ) f(a,b)-f(a-1,b)=\sum_{i=0}^b\binom{2i+a}i-\binom{2i+a-1}{i}\\
=\sum_{i=0}^b\binom{2i+a-1}{i-1}\\
=\sum_{i=0}^{b-1}\binom{2i+a+1}{i}\\
=f(a+1,b-1)\\
\color{red}f(a,b)=f(a+1,b-1)+f(a-1,b)\\
f(a-1,b),f(a,b) \to f(a+1,b-1),f(a,b)\to f(a,b),f(a+1,b)
f ( a , b ) − f ( a − 1 , b ) = i = 0 ∑ b ( i 2 i + a ) − ( i 2 i + a − 1 ) = i = 0 ∑ b ( i − 1 2 i + a − 1 ) = i = 0 ∑ b − 1 ( i 2 i + a + 1 ) = f ( a + 1 , b − 1 ) f ( a , b ) = f ( a + 1 , b − 1 ) + f ( a − 1 , b ) f ( a − 1 , b ) , f ( a , b ) → f ( a + 1 , b − 1 ) , f ( a , b ) → f ( a , b ) , f ( a + 1 , b )
最后一行表明了可以 O ( 1 ) \mathcal O(1) O ( 1 ) 通过已知的 f ( x − 1 , y ) , f ( x , y ) f(x-1,y),f(x,y) f ( x − 1 , y ) , f ( x , y ) 推导到 x ← x + 1 x\gets x+1 x ← x + 1 ,而最后要求解的式子中 c i + i c_i+i c i + i 是单调递增的(c i − c i + 1 ≤ 1 c_i-c_{i+1}\le 1 c i − c i + 1 ≤ 1 ),第二维也是单调递减的。考虑使用类似莫队的指针维护 f ( a , b ) ◊ f(a,b)\Large{\color{red}\Diamond} f ( a , b ) ◊ 。总复杂度为 O ( n ) \mathcal O(n) O ( n ) 。
ZROJ
将 a i a_i a i 称为颜色。考虑对于线段树每个区间维护完全覆盖其的区间个数。具体地,先将 n n n 个区间插入线段树,然后对于每个线段树节点记录它到根路径上经过的颜色种数 t r p tr_p t r p 。实际上,只需要维护颜色种数为 = 0 / = 1 / ≥ 2 =0/=1/\ge 2 = 0 / = 1 / ≥ 2 即可。对于一次区间删除操作,可以类似看作对开始时插入操作的撤销,因为有 t r p ≤ t r s o n tr_p\le tr_{son} t r p ≤ t r s o n ,所以只需要检查儿子能否改变 t r tr t r ,若能就继续递归检查,否则结束。因为所有点只会变化至多 2 2 2 次,总复杂度为 O ( n log n ) \mathcal O(n\log n) O ( n log n ) 。