发现可以拆询问,答案即为:
∑ x q ( r 1 , r 2 ) − q ( l 1 − 1 , r 2 ) − q ( r 1 , l 2 − 1 ) + q ( l 1 − 1 , l 2 − 1 ) \displaystyle\sum_{x}q(r_1,r_2)-q(l_1-1,r_2)-q(r_1,l_2-1)+q(l_1-1,l_2-1)
x ∑ q ( r 1 , r 2 ) − q ( l 1 − 1 , r 2 ) − q ( r 1 , l 2 − 1 ) + q ( l 1 − 1 , l 2 − 1 )
其中 q ( a , b ) = get ( 1 , a , x ) get ( 1 , b , x ) q(a,b)=\operatorname{get}(1,a,x)\operatorname{get}(1,b,x) q ( a , b ) = g e t ( 1 , a , x ) g e t ( 1 , b , x ) .
q ( a , b ) q(a,b) q ( a , b ) 使用莫队维护,移动端点 l , r l,r l , r 的过程中维护 c x , d x c_x,d_x c x , d x ,分别表示 [ 1 , l ] , [ 1 , r ] [1,l],[1,r] [ 1 , l ] , [ 1 , r ] 区间内 x x x 的出现次数.容易维护答案.
用并查集维护连通性,权值线段树维护联通块内的排名.
注意合并并查集和合并权值线段树的方向要一致.
趣味数学题.
进行一个式子的推,我们有:
( A 2 ) i , j = ∑ k = 1 n A i , k A k , j = ∑ k = 1 n a i b k a k b j = a i b j ∑ k = 1 n a k b k = A i , j ∑ k = 1 n A k , k \begin{aligned}
\left(A^2\right)_{i,j}
&= \sum_{k=1}^n A_{i,k}A_{k,j} \\
&= \sum_{k=1}^n a_ib_ka_kb_j \\
&= a_ib_j\sum_{k=1}^n a_kb_k \\
&= A_{i,j}\sum_{k=1}^n A_{k,k} \\
\end{aligned}
( A 2 ) i , j = k = 1 ∑ n A i , k A k , j = k = 1 ∑ n a i b k a k b j = a i b j k = 1 ∑ n a k b k = A i , j k = 1 ∑ n A k , k
归纳可得:
( A x ) i , j = A i , j ( ∑ k = 1 n A k , k ) x − 1 \left(A^x\right)_{i,j}=A_{i,j}\left(\sum_{k=1}^n A_{k,k}\right)^{x-1}
( A x ) i , j = A i , j ( k = 1 ∑ n A k , k ) x − 1
所以有:
∑ i = 1 n ∑ j = 1 n ( A x ) i , j = ∑ i = 1 n ∑ j = 1 n A i , j ( ∑ k = 1 n A k , k ) x − 1 = ( ∑ k = 1 n A k , k ) x − 1 ∑ i = 1 n ∑ j = 1 n A i , j = ( ∑ k = 1 n a k b k ) x − 1 ∑ i = 1 n ∑ j = 1 n a i b j = ( ∑ k = 1 n a k b k ) x − 1 ( ∑ i = 1 n a i ) ( ∑ i = 1 n b i ) \begin{aligned}
\sum_{i=1}^n\sum_{j=1}^n\left(A^x\right)_{i,j}
&= \sum_{i=1}^n\sum_{j=1}^nA_{i,j}\left(\sum_{k=1}^n A_{k,k}\right)^{x-1} \\
&= \left(\sum_{k=1}^n A_{k,k}\right)^{x-1}\sum_{i=1}^n\sum_{j=1}^n A_{i,j} \\
&= \left(\sum_{k=1}^n a_kb_k\right)^{x-1}\sum_{i=1}^n\sum_{j=1}^n a_ib_j \\
&= \left(\sum_{k=1}^n a_kb_k\right)^{x-1}\left(\sum_{i=1}^n a_i\right)\left(\sum_{i=1}^n b_i\right) \\
\end{aligned}
i = 1 ∑ n j = 1 ∑ n ( A x ) i , j = i = 1 ∑ n j = 1 ∑ n A i , j ( k = 1 ∑ n A k , k ) x − 1 = ( k = 1 ∑ n A k , k ) x − 1 i = 1 ∑ n j = 1 ∑ n A i , j = ( k = 1 ∑ n a k b k ) x − 1 i = 1 ∑ n j = 1 ∑ n a i b j = ( k = 1 ∑ n a k b k ) x − 1 ( i = 1 ∑ n a i ) ( i = 1 ∑ n b i )
分别计算 ( ∑ i = 1 n a i b i ) k − 1 \left(\displaystyle\sum_{i=1}^n a_ib_i\right)^{k-1} ( i = 1 ∑ n a i b i ) k − 1 ,∑ i = 1 n a i \displaystyle\sum_{i=1}^n a_i i = 1 ∑ n a i 和 ∑ i = 1 n b i \displaystyle\sum_{i=1}^n b_i i = 1 ∑ n b i 即可.
不难发现一个 SCC 中的所有点对一定满足半联通性质,所以我们先 SCC 缩点,设缩点后点的点权为其对应的 SCC 大小.
缩完点后的图变成了一个 DAG,可以发现我们只能选取这样的图中的一条链,所以我们的问题变成了求一个 DAG 中点权和最大的一条链的长度和这样的链的数目,不难用 dp 解决这个问题.
设 f u f_u f u 表示结束在 u u u 的链的最大点权和,g u g_u g u 表示点权和最大的链的个数.令 E u E_u E u 表示 u u u 的入边集,w u w_u w u 表示 u u u 的点权,我们有如下转移:
f v ← max ( u , v ) ∈ E v { f u + w v } f_v\leftarrow\max_{(u,v)\in E_v}\{f_u+w_v\}
f v ← ( u , v ) ∈ E v max { f u + w v }
∀ ( u , v ) ∈ E v , g v ← { g u if f v = f u + w v g u + g v if f v < f u + w v \forall (u,v)\in E_v,g_v\leftarrow
\begin{cases}
g_u & \text{if }f_v=f_u+w_v \\
g_u+g_v & \text{if }f_v<f_u+w_v
\end{cases}
∀ ( u , v ) ∈ E v , g v ← { g u g u + g v if f v = f u + w v if f v < f u + w v
值得一提的是,tarjan 缩点给 SCC 的编号是逆拓扑序,可以直接 dp.
首先注意到一个 E-BCC 中的所有点对一定有两条不同的路径联通,所以我们可以先 E-BCC 缩点.缩点完之后变成了一棵树,其中树上的所有边都是原图中的割边.
对于我们加入的一条边 ( u , v ) (u,v) ( u , v ) ,u u u 到 v v v 的路径上的所有割边均被消除,为了最小化答案,我们加入的边一定都在叶子中连接.
记叶子个数为 x x x .叶子个数为偶数时,我们需要连接 x 2 \displaystyle\frac{x}{2} 2 x 条边才能消除所有割边,这是因为一次连边最多消除 2 2 2 个叶节点;奇数时先丢掉 1 1 1 个叶节点,按照偶数方式处理,最后只剩 2 2 2 个节点时再连 1 1 1 条边,就能消除所有割边.
综上,答案为 ⌈ x 2 ⌉ \displaystyle\left\lceil \frac{x}{2} \right\rceil ⌈ 2 x ⌉ .
首先,无权图定长路径计数是可以 通过矩阵乘法在 O ( n 3 log k ) O(n^3\log k) O ( n 3 log k ) 内解决 的.
然后对于本题,注意到边权较小,而正权图可以拆边变成无权图,所以拆边后直接构造矩阵进行快速幂即可 .
注意到这样做的点的级别为 O ( W m ) O(Wm) O ( W m ) ,其中 W W W 是最大的边权,m m m 是边的数量.总时间复杂度 O ( ( W m ) 3 log t ) O((Wm)^3\log t) O ( ( W m ) 3 log t ) ,不可接受.
我们换一个建模方式.把每个点拆成 8 8 8 个点,记 u u u 拆成的第 i i i 个点为 u i u_i u i ,u i u_i u i 和 u i + 1 u_{i+1} u i + 1 之间存在一条边.对于原图中的一条边 ( u , v ) (u,v) ( u , v ) ,记其边权为 w w w ,在拆点后对应的边为 ( u 1 , v w ) (u_1,v_w) ( u 1 , v w ) .然后对拆点后的图构造矩阵进行快速幂,复杂度 O ( ( W n ) 3 log t ) O((Wn)^3\log t) O ( ( W n ) 3 log t ) ,可以通过本题.
[USACO 2005 February Gold] Secret Milking Machine
模拟赛做到的题目.似乎只有 POJ 提供这题的评测,所以在此放出题面.
题意
有一 n n n 个点 m m m 条边的带权图,需要找到 t t t 条由 1 1 1 到 n n n 的路径,使得这 t t t 条路径上边权的最大值最小.
解法
看到最大值最小,考虑二分最大值.
设当前二分答案为 x x x .我们断开边权大于 x x x 的所有边,检查在这个图中 1 1 1 到 n n n 的路径数是否满足条件.问题转化为图上路径计数问题.
容易使用网络流来解决这个问题.我们将剩下边的流量设置成 1 1 1 ,1 1 1 到 n n n 的最大流即为路径数.
设 f i f_i f i 为前 i i i 个玩具装箱后的最小代价,有如下转移:
f i ← min j < i { f j + [ ( i − ( j + 1 ) + ∑ k = j + 1 i C k ) − L ] 2 } f_i\leftarrow\min_{j<i}\left\{f_j+\left[\left(i-(j+1)+\sum_{k=j+1}^iC_k\right)-L\right]^2\right\}
f i ← j < i min ⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ f j + ⎣ ⎢ ⎡ ⎝ ⎛ i − ( j + 1 ) + k = j + 1 ∑ i C k ⎠ ⎞ − L ⎦ ⎥ ⎤ 2 ⎭ ⎪ ⎪ ⎬ ⎪ ⎪ ⎫
记 s x = ∑ i = 1 x C i \displaystyle s_x=\sum_{i=1}^xC_i s x = i = 1 ∑ x C i ,转移式可化为:
f i ← min j < i { f j + [ ( i − ( j + 1 ) + s i − s j ) − L ] 2 } f_i\leftarrow\min_{j<i}\left\{f_j+\left[\left(i-(j+1)+s_i-s_j\right)-L\right]^2\right\}
f i ← j < i min { f j + [ ( i − ( j + 1 ) + s i − s j ) − L ] 2 }
时间复杂度为 O ( n 2 ) O\left(n^2\right) O ( n 2 ) ,无法通过本题.
令 t x = s x + x , l = L + 1 t_x=s_x+x,l=L+1 t x = s x + x , l = L + 1 ,注意到上式可化为:
f i ← min j < i { f j + t j 2 + 2 t j ( l − t i ) } + ( l − t i ) 2 f_i\leftarrow\min_{j<i}\left\{f_j+{t_j}^2+2t_j(l-t_i)\right\}+(l-t_i)^2
f i ← j < i min { f j + t j 2 + 2 t j ( l − t i ) } + ( l − t i ) 2
若对于当前转移有状态 f p f_p f p 优于 f q f_q f q ,那么必然有:
f p + t p 2 + 2 t p ( l − t i ) < f q + t q 2 + 2 t q ( l − t i ) ⇒ f p + t p 2 − f q + t q 2 < − 2 t p ( l − t i ) + 2 t q ( l − t i ) ⇒ ( f p + t p 2 ) − ( f q + t q 2 ) < − 2 ( t p − t q ) ( l − t i ) ⇒ ( f p + t p 2 ) − ( f q + t q 2 ) ( t p − t q ) < − 2 ( l − t i ) \begin{alignedat}{}
&& f_p+{t_p}^2+2t_p(l-t_i) &< f_q+{t_q}^2+2t_q(l-t_i) \\
&\Rightarrow& f_p+{t_p}^2-f_q+{t_q}^2 &< -2t_p(l-t_i)+2t_q(l-t_i) \\
&\Rightarrow& \left(f_p+{t_p}^2\right)-\left(f_q+{t_q}^2\right) &< -2(t_p-t_q)(l-t_i) \\
&\Rightarrow& \frac{\left(f_p+{t_p}^2\right)-\left(f_q+{t_q}^2\right)}{(t_p-t_q)} &< -2(l-t_i)
\end{alignedat}
⇒ ⇒ ⇒ f p + t p 2 + 2 t p ( l − t i ) f p + t p 2 − f q + t q 2 ( f p + t p 2 ) − ( f q + t q 2 ) ( t p − t q ) ( f p + t p 2 ) − ( f q + t q 2 ) < f q + t q 2 + 2 t q ( l − t i ) < − 2 t p ( l − t i ) + 2 t q ( l − t i ) < − 2 ( t p − t q ) ( l − t i ) < − 2 ( l − t i )
然后就可以斜率优化了.用单调队列维护决策点,时间复杂度 O ( n ) O(n) O ( n ) .
记第 i i i 个矩形需要涂的颜色为 c i c_i c i ,需要在第 i i i 个矩形之前涂完色的矩形集合为 L i L_i L i .
设 f S , x f_{S,x} f S , x 表示当前已涂色矩形集合为 S S S ,最后一次涂的颜色为 x x x 时的最小涂色次数,转移时枚举本次涂色的矩形 i i i 和上一次涂色的颜色 a a a ,转移方程如下:
f S ∪ { i } , c i = min { f S , a + [ a ≠ c i ] } f_{S\cup\{i\},c_i}=\min\{f_{S,a}+[a\not=c_i]\}
f S ∪ { i } , c i = min { f S , a + [ a = c i ] }
注意到 1 ≤ N ≤ 16 1\le N\le 16 1 ≤ N ≤ 1 6 ,允许我们将集合压位储存.
我们使用分块解决这个问题.
考虑分块如何维护颜色信息,我们可以在每个块中开 C C C 个并查集,每个并查集中维护相同颜色的元素.初始化时,将每个元素插入到其颜色对应的并查集中.
先考虑怎么做第二个操作:对于整块 i i i ,在 i i i 中颜色 x x x 对应的并查集的根节点上打上标记,通过维护并查集大小,容易计算块中元素更新后的和;对于散块,暴力修改即可.
然后考虑怎么做第一个操作:对于整块,将其中颜色 x x x 、y y y 对应的并查集合并;对于散块,将每个元素从 x x x 对应的并查集中扣出来,插入 y y y 对应的并查集中.注意到整块颜色合并时,如果直接将 x x x 并到 y y y 上,y y y 上原本的标记会下传到 x x x 中,所以合并时应当新建节点 z z z ,将 x x x 和 y y y 都合并到 z z z 上.
先建出最小生成树 T T T ,枚举不在 T T T 的边集中的边 ( u , v , w ) (u,v,w) ( u , v , w ) ,我们尝试用这条边去替换 T T T 上的边,得到另外一个合法的生成树.要求次小生成树,这条边只会替换 T T T 中 u u u 到 v v v 路径上最大的边权所对应的那条边,倍增或者树剖维护一下即可.题目要求严格次小生成树,只需在维护路径上最大值的同时维护一个严格次大值,若最大值等于 w w w ,就用这条边替换严格次大的边权所对应的那条边.