浅谈一类最小乘积问题

由于本人在出题的时候出了最小乘积带权二分图的板子并且混不自知,发现网上对于一系列最小乘积问题的证明和整理都不算特别多,故写下此博客。

首先给出一个 c l a s s i c classic classic 并且 e d u c a t i o n a l educational educational 的问题。

P5540 最小乘积生成树

题目描述

给出一个 n n n 个点 m m m 条边的无向图,第 i i i 条边有两个权值 a i a_i ai b i b_i bi 。求该图的一棵生成树 T T T ,使得
( ∑ e ∈ T a e ) × ( ∑ e ∈ T b e ) \left(\sum_{e\in T}a_e\right)\times\left(\sum_{e\in T}b_e\right) (eTae)×(eTbe)
最小。

x = ∑ e ∈ T a e x=\sum_{e\in T}a_e x=eTae , y = ∑ e ∈ T y=\sum_{e\in T} y=eT , 那么每一棵生成树对应二维平面上的点 x , y x,y x,y

凸性证明

我们考虑用曲线 k = x y k=xy k=xy 来截这些点 , 于是需要找到 k k k 最小的曲线使得有点在这条曲线上 , 容易发现这个点肯定在下凸壳上 , 考虑证明 。

我们设凸包上的点 ( a , b ) (a,b) (a,b) , ( a + c , b + d ) (a+c,b+d) (a+c,b+d) , 有 c > 0 , d < 0 c>0,d<0 c>0,d<0

那么我们假定一个凸包内的点 ( a + c t , b + d t ) (a+ct,b+dt) (a+ct,b+dt) , 有 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1

那么这个点的代价是 :

( a + c t ) ( b + d t ) = c d t 2 + ( a d + b c ) t + a b (a+ct)(b+dt)=cdt^2+(ad+bc)t+ab (a+ct)(b+dt)=cdt2+(ad+bc)t+ab

由于 c d < 0 cd<0 cd<0 , 关于 t t t 的代价函数是一个开口向下的二次函数 , 那么这个最小值一定存在于边界也就是 t = 0 t=0 t=0 或者是 t = 1 t=1 t=1 的情况 , 由此得证凸性。

quick-convex 构造

有该结论以后可以找到 x x x 最大的点和 y y y 最大的点 , 使用一步 q u i c k − c o n v e x quick-convex quickconvex 算法即可完成 。

接下来具体讲述如何使用 q u i c k − c o n v e x quick-convex quickconvex 算法 。

对于目前已有点 A A A B B B , 目的是要求 A B AB AB 线段最下方的点 C C C 。将其分为 A C AC AC C B CB CB 两段 , 然后接着分治下去 。

考虑如何找到最下方的点 C C C , 可以用面积考虑 。 我们需要找到一个点 C C C 使得 S Δ A B C S_{\Delta ABC} SΔABC 最小 。

用向量表示 A B ⃗ , A C ⃗ \vec{AB} , \vec{AC} AB ,AC , 面积是 S = − A B ⃗ × A C ⃗ 2 S=-\frac{\vec{AB}\times \vec{AC}}{2} S=2AB ×AC , 考虑打开这个柿子 。

A B ⃗ × A C ⃗ = ( x B − x A ) ( y C − y A ) − ( x C − x A ) ( y B − y A ) {\vec{AB}} \times {\vec{AC}}={(x_B-x_A)(y_C-y_A)-(x_C-x_A)(y_B-y_A)} AB ×AC =(xBxA)(yCyA)(xCxA)(yByA)

= ( x B − x A ) y C + ( y A − y B ) x C − ( x B − x A ) y A + ( y B − y A ) x A =(x_B-x_A)y_C+(y_A-y_B)x_C-(x_B-x_A)y_A+(y_B-y_A)x_A =(xBxA)yC+(yAyB)xC(xBxA)yA+(yByA)xA

发现后面两项是常数 , 前面两项与 C C C 有关 。

考虑将边权改为 ( x B − x A ) b i + ( y A − y B ) a i (x_B-x_A)b_i + (y_A-y_B)a_i (xBxA)bi+(yAyB)ai 即可得到 C C C 的坐标 。

另一种转化

看到这个边权 , 我们其实发现这是一个最小化和 A B AB AB 同斜率在 y y y 轴截距最小直线的问题 。 令直线 A B AB AB 斜率为 − k -k k , 需要最小化 k x + y kx+y kx+y 的值 , 把每条边权替换成 k a i + b i ka_i+b_i kai+bi 可以得到和上面一样的柿子。

关键代码
inline void solve(Point A,Point B)
{
	For(i,1,m)
		e[i].w=e[i].b*(B.x-A.x)+e[i].a*(A.y-B.y);
	Point C=kruskal();
	if(cross((B-A),(C-A))>=0) return;
	solve(A,C),solve(C,B);
}
时间复杂度分析

真的没有营养 , 没有必要去看。

另外这种做法的时间复杂度其实一直是个迷 , 理论分析比较困难。

接下来将证明 n n n 个点凸包上的点是 R 2 3 R^{\frac{2}{3}} R32 级别的 , 其中 R R R 为点的坐标范围 , 是 [ 0 − R ] [0-R] [0R] 的 , 本题中 R = m a x ( s u m a , s u m b ) R=max(suma,sumb) R=max(suma,sumb)

考虑我们构造出的凸壳大小为 T T T , 我们得到的凸壳点集为 V V V , 这个凸壳是一个左下凸壳 。 考虑翻转凸壳变为右下凸壳 , 得到的点集按横坐标进行排序得到 ( x i , y i ) (x_i,y_i) (xi,yi) ,由于是右下下凸壳 , 斜率从0开始依次递增 , 而且斜率两两不相等 。

所以可以设 v i v i + 1 v_iv_{i+1} vivi+1 的斜率为 p q \frac{p}{q} qp , p , q p,q p,q 为互质的正整数 。 可以得到 :

y i + 1 − y i x i + 1 − x i = p q \frac{y_{i+1}-y_i}{x_{i+1}-x_i} = \frac{p}{q} xi+1xiyi+1yi=qp , 显然是有 y i + 1 − y i = p × t , x i + 1 − x i = q × t y_{i+1}-y_i=p \times t,x_{i+1}-x_i=q \times t yi+1yi=p×t,xi+1xi=q×t , t ≥ 1 t \geq 1 t1

那么就有 ( x i + 1 + y i + 1 ) − ( x i + y i ) = ( p + q ) × t ≥ p + q (x_{i+1}+y_{i+1})-(x_i+y_i)=(p+q) \times t \geq p+q (xi+1+yi+1)(xi+yi)=(p+q)×tp+q

所有柿子相加 , 那么就有 x T + y T − ( x 1 + y 1 ) ≥ ∑ i = 1 T − 1 p i + q i x_T+y_T-(x_1+y_1) \geq \sum_{i=1}^{T-1} p_i+q_i xT+yT(x1+y1)i=1T1pi+qi

容易得知

x T + y T − ( x 1 + y 1 ) ≤ R + R x_T+y_T-(x_1+y_1) \leq R+R xT+yT(x1+y1)R+R

s u m i = 1 T − 1 p i + q i ≤ 2 × R sum_{i=1}^{T-1} p_i+q_i \leq 2 \times R sumi=1T1pi+qi2×R

于是我们需要找到一个最小的 T ′ T' T 使得对于分子分母和前 T ′ T' T 小的分子分母均为正整数的既约分数 (注意不是既约真分数) , 其分子分母的和大于 2 × R 2 \times R 2×R , 这个 T ′ T' T 就是 T T T 的上界。我们在下文所叙述的 T T T 的意义即为 T ′ T' T 也就是 T T T 的上界。

分子分母均为既约分数的前 i i i 小分子分母和的大小记为 F i F_i Fi ,实质上是正整数到正有理数的正则双射中的分母 ≤ 1 \leq 1 1 的情况 A038567 ,构造序列 P P P 使得每个数 i i i 都恰好在 P P P 中连续出现 i i i 次 , 也就是数列 A002024 , 令其前 i i i 项的和为 G i G_i Gi 。考虑到分子分母和为 i i i 且分子分母都为正整数的既约分数不会超过 i i i 个 , 所以一定有 F ( i ) ≥ G ( i ) F(i) \geq G(i) F(i)G(i) , 要证 $F(T) \geq 2 \times R $ 只需要证明 $G(T) \geq 2 \times R $ 即可 。

考虑如何对于 G ( T ) G(T) G(T) 求和 , 我们考虑 P P P 的详尽定义是对于 i ≥ 1 i \geq 1 i1 , i × ( i − 1 ) 2 < j ≤ i × ( i + 1 ) 2 \frac{i\times (i-1)}{2} < j \le \frac{i \times (i+1)}{2} 2i×(i1)<j2i×(i+1) , 有 P i = j P_i=j Pi=j

于是对于下标为 i × ( i + 1 ) 2 \frac{i \times (i+1)}{2} 2i×(i+1) G ( i × ( i + 1 ) 2 ) = ∑ j = 1 i i 2 G(\frac{i \times (i+1)}{2})=\sum_{j=1}^{i} i^2 G(2i×(i+1))=j=1ii2

考虑令 t = T t=\sqrt{T} t=T 容易得到 G ( T ) ≥ G ( t × ( t + 1 ) 2 ) = ∑ i = 1 t i 2 G(T) \geq G(\frac{t \times (t+1)}{2}) = \sum_{i=1}^{t} i^2 G(T)G(2t×(t+1))=i=1ti2

众所周知平方和等于 :

∑ i = 1 t i 2 = t ( t + 1 ) ( 2 t + 1 ) 6 \sum_{i=1}^{t} i^2=\frac{t(t+1)(2t+1)}{6} i=1ti2=6t(t+1)(2t+1)

也就是:

t ( t + 1 ) ( 2 t + 1 ) 6 ≥ 2 × R \frac{t(t+1)(2t+1)}{6} \geq 2 \times R 6t(t+1)(2t+1)2×R

的最大的 T T T , 解出来可以近似认为是 R 2 3 R^{\frac{2}{3}} R32 级别的 (不会真的有人去解吧) ,由于放缩的问题其实离上界有一定的距离 , 其实跑起来效率是很高的 。

其实对于这个问题我们只取了左下凸壳 , 容易得知对于一个凸包来说 , 它的大小是 4 T 4T 4T , 其实更接近雨 R 2 3 R^{\frac{2}{3}} R32

回到本题 , 这样的话凸包上的点的个数为 $O((na)^{\frac{2}{3}}) $ 级别 , 所以本体的复杂度事实上是 $O((na)^{\frac{2}{3}}m logm) $ 的 , l o g m logm logm 在于对边排序 , 如果你会 O ( m ) O(m) O(m) 线性最小生成树的话那就可以做到 $O((na)^{\frac{2}{3}}m) $ 。

总结与评价

其实能看出来这种套路推广不是很多 , 题目相对较少因为它实在太过于 e d u c a t i o n a l educational educational 以至于一道类似的题目只能区分做过这道题目与没有做过这道题目的人 。 是一种图论和计算几何的结合比较好的类型 。

因为二维乘积形式太过于完美联想到二维平面 , 导致我很难有别的优美的 i d e a idea idea 讲一些代价形成的点映射到二维平面上 。 如果有的话请务必告诉我 (因为笔者是在太菜了,水平真的有限,能力真的不够)

q u i c k − c o n v e x quick-convex quickconvex 做法是一种增量法 , 理论上来讲可以推广到高维空间 , 但我觉得没有必要 , 而且时间复杂度的分析会变得更加困难 , 实现也会很麻烦 , 等我会了三维凸包再来(其实要退役了 , 也没有机会去学了)。

最小乘积带权二分图

题目描述

小 T 准备在家里摆放几幅画,为此他买来了 N N N 幅画和 N N N 个画框。为了体现他的品味,小 T 希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和。

对于第 i i i 幅画与第 j j j 个画框的配对,小 T 都给出了这个配对的平凡度 A i , j A_{i, j} Ai,j 与违和度 B i , j B_{i, j} Bi,j 。整个搭配方案的总体不和谐度为每对画与画框平凡度之和与每对画与画框违和度的乘积。具体来说,设搭配方案中第 i i i 幅画与第 P i P_i Pi 个画框配对,则总体不和谐度为

d i s h a r m o n y = ∑ i = 1 N A i , p i × ∑ i = 1 N B i , p i \mathrm{disharmony}=\sum_{i=1}^{N}A_{i,p_i}\times \sum_{i=1}^{N}B_{i,p_i} disharmony=i=1NAi,pi×i=1NBi,pi
小 T 希望知道通过搭配能得到的最小的总体不和谐度是多少

题目解析

发现是最小乘积二分图完美匹配 , 可以用费用流做或者是使用 K M KM KM 算法 。直接上 q u i c k − c o n v e x quick-convex quickconvex 算法和最小乘积生成树一摸一样的做法。

时间复杂度和上面分析是一样的 , 只是把最小生成树所花费的时间变成 K M KM KM 的时间( O ( n 3 ) O(n^3) O(n3) )而已 。

总结与评价

所以说这个东西就完全就是一点用处没有就只是个能区分见没见过这个 trick 的人而已。对于没有见过他的人这种题目难度很大而且非常不可做亲测有效, 而见过这东西的人看到其他的类似题目都完全是秒切吧。

其实这很好的告诉我们这种乘积问题本身在二维平面上就带有凸性 , 可以适配很多的图论模型 。 我们可以在这里定义这类问题为 广义最小乘积问题 。时间复杂度为 O ( V 2 3 × K ) O(V^{\frac{2}{3}} \times K) O(V32×K) , V V V为值域 , K K K 是求出一次价值所需要的时间。 而且可以输出方案。

NOI2022 Day2 T3 二次整数规划问题

solution of P8501

虽然还没有过但我坚信可以过所以等以后有时间再去调。

显然除了固定选择的 1 1 1 , 5 5 5 外我们不希望其为 1 1 1 , 5 5 5 。 证明的话可以把 1 1 1 5 5 5 替换成 2 2 2 , 4 4 4 。 发现不仅多了 c × v c \times v c×v 的贡献还多了 2 , 4 → 3 2,4 \rightarrow 3 2,43 的贡献 。

对于 k = 5 k=5 k=5 的情况 ,由于 c 3 c_3 c3 可以通过 c 1 , c 2 , c 4 , c 5 c_1,c_2,c_4,c_5 c1,c2,c4,c5 表示 ,所以我们每次都可以用一个二元组 ( c 2 , c 4 ) (c_2,c_4) (c2,c4) 描述这个问题 。

回过头看我们要求的价值 , 为了防止在其中出现 n n n , 考虑用增量解决这个问题 。

( 0 , 0 ) → ( c 2 , c 4 ) (0,0) \rightarrow (c_2,c_4) (0,0)(c2,c4) 所增加的贡献是 :

c 2 × ( v 2 − v 3 + 2 e 6 × c 1 ) + c 4 × ( v 4 − v 3 + 2 e 6 × c 5 ) − 2 e 6 × c 2 × c 4 c_2 \times (v2 - v3 + 2e6 \times c_1)+ c_4 \times (v_4 - v_3 + 2e6 \times c5) - 2e6 \times c_2 \times c_4 c2×(v2v3+2e6×c1)+c4×(v4v3+2e6×c5)2e6×c2×c4

c 2 , c 4 c_2,c_4 c2,c4 当做主元 , 可以发现他可以写成 $ -2e6 \times (c_2-C_2) \times (c_4-C_4) + H$ 的形式 , C 2 , C 4 , H C_2 , C_4 , H C2,C4,H 都为常数 。

那么相当于把 x y = k xy=k xy=k 这条曲线从第一象限平移 , 左上角和右下角和左下角这三个特殊点在一二四象限的时候有答案 。第三象限相当于是求出 min ⁡ x × y \min x \times y minx×y , 是最小乘积生成树的做法。

考虑怎么限制 , 可以用网络流的切糕模型解决 。 具体而言是 s s s 连向 2 2 2 的点 , 4 4 4 的点连向 t t t ,对于相等的数用并查集缩成一个点 , 将限制为 1 1 1 的看做 “有些 2 2 2 和有些 4 4 4 只能选一个” , 从 4 4 4 的点向 2 2 2 的点连 i n f inf inf 的边权即可。

写在最后

本文作者已经完全是一个失败主义者了。

如果有些不明白的可以和我交流 。 由于小蒟蒻水平太低 , 不免有哪里写错 , 如果有写错的地方也请大佬们不要 d 小蒟蒻 (小声) , 我会立刻修改的。

或许 , 我本来就不是学 OI 这块料吧 。

感谢你们读到了最后,希望你们前程似锦 , 在 OI 的路上越走越远。

  • 47
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值