【闲话 No.4】 wqs 二分

你呀你呀

很好听的派蒙歌,6.1 要备战期末没法放歌所以在 5 月底放了每日一歌,希望可以让大家开心一些,也希望派蒙生日快乐!

你呀你呀 快给我休息一下
长了颗痘又 掉了好几根头发
怎么不说话 是不是记忆力也变差
呆了 谁陪 我呀

知不知道 你的眼神越来越可怕
贪黑起早 直奔魑魅魍魉 耍刀枪
未来计划已经安排得密密麻麻
看了让人害怕~

我很sure sure
你会累垮
我要赶紧想个办法 让你重新变得优雅
我很sure sure
这个星球
明天不会爆炸~

你呀你呀 快给我休息一下
长了颗痘 又掉了好几根头发
怎么不说话 是不是记忆力也变差
呆了 谁陪 我呀
笑肌抬一下 露出快乐的门牙
不要不要被 别人的标准绑架
你永远是我 眼中最优秀的冒险家
今天 休息 听话

恩咳咳,怎么了怎么了
你这人看起来怎么精神不太好
需要本大爷帮忙是吧
哈哈哈哈,让我看看你的日程
我的杵子挥一挥
阿丑唤一声咩咩
攀高危险都消灭
在五朵蘑菇上跳跃
调皮的水母追一追
你就安静歇歇
新的委托别理会
我替你拒绝
额天牛之章你要不还是自己做一下吧……

我很确定
你不简单
孤军奋战走到现在 还带着小孩
(派蒙:喂,放牛的!)
I’m sure sure
从不偷懒
快乐就少一半

你呀你呀 快给我休息一下
长了颗痘 又掉了好几根头发
怎么不说话 是不是记忆力也变差
呆了 谁陪 我呀
笑肌抬一下
露出快乐的门牙
没有人可以 永远奔跑不停下
世界那么大 整理好了心情再出发
今天 休息 听话

LALALALALA
听完这首歌 明天再去和生活打架
累了 睡吧 晚安

温馨提示

本文当中的式子大多都经过了参考资料的证实,但是证明细节含有大量 poi 酱口胡的成分,不免多有谬误,欢迎读者在评论区指出!
本文对拉格朗日对偶、minimax 定理等知识大多只先介绍最易懂且与 wqs 二分相关的内容,感兴趣的读者可以参阅本文的参考资料了解更为一般的结论。

定义

我们定义一个函数 \(f(x)\) 是上凸的,当且仅当 \(f(\lambda x+(1-\lambda)y)\geq{\lambda f(x)+(1-\lambda)f(y)}\),或者说这个函数的斜率递减。
我们定义一个函数 \(g(x)\) 是下凸的,当且仅当 \(g(\lambda x+(1-\lambda)y)\leq{\lambda g(x)+(1-\lambda)g(y)}\),或者说这个函数的斜率递增。

wqs 二分

wqs 二分,可以用来求上凸函数 \(f(x)\) 的点值。使用 wqs 二分求点值时这个点值一般不容易直接求,但是易于求得 \(f'(k)=\max_{x}{\{f(x)-kx\}}\),比如要求在一定限制下恰好取 \(x\) 个物品的最大收益 \(f(x)\)(“一定限制”限制了取最大的 \(x\) 个物品等方法是非法的,且使得 \(f(x)\) 上凸),此时因为“恰好”的限制,使得求 \(f(x)\) 很难进行,但求 \(f'(k)\) 相当于给每个物品的收益减 \(k\) 以后在“一定限制”下进行 dp 转移,因此一般容易求出。
我们先给出结论:有函数

\[\begin{aligned} &g(\lambda)\\=&f'(\lambda)+k\lambda\\=&\max_{x}{\{f(x)-\lambda x\}+k\lambda} \end{aligned} \]

是下凸的且它的最小值是 \(f(k)\),因此我们可以令 \(k\) 为那个要带入 \(f\) 求值的数,二分求出这个函数的最小值即可得到 \(f(k)\),此时如果求 \(f'(x)\)\(O(n)\) 的,那么加上二分的总复杂度为 \(O(n \log n)\)
接下来我们考虑证明这个结论。首先考虑把我们要求的东西转化成求 \(f(x)\) 的最大值,要求取到最大值的 \(x\) 满足 \(h(x)=0\),其中 \(h(x)=k-x\)。显然这一限制使得 \(f\) 只能在 \(k\) 处取值,结果也一定是 \(f(k)\)。考虑把式子变成

\[\max_{x}\min_{\lambda}{\{f(x)+\lambda{h(x)}\}} \]

其中 \(\lambda\) 是一个上界够大下界够小的数,使得当 \(h(x)>0\) 时可以在 \(\lambda\) 为最小值时令 \(f(x)+\lambda{h(x)}\) 极小而对外层的 \(\max\) 没有贡献,而当 \(h(x)<0\) 时则需要 \(\lambda\) 足够大。把原式变成

\[\max_{x}\min_{\lambda}{\{f(x)-\lambda x+k\lambda\}} \]

发现他与

\[\min_{\lambda}g(\lambda)=\min_{\lambda}\max_{x}{\{f(x)-\lambda x+k\lambda\}} \]

形式非常相似,下面我们先不考虑 \(g\) 的凸性,考虑 \(\min\)\(\max\) 能否互换。
考虑对于 \(f(x)+\lambda h(x)\),当 \(x\) 确定时,这个式子的值关于 \(\lambda\) 线性。现在假设这个式子的最小值在 \(\lambda\) 极大时取道,事实上下面的证明只需用到对于不同的 \(x\) 该式在同一 \(\lambda\) 处取最小值,所以这个假设对正确性没有影响。现在考虑 \(\lambda\) 确定时,这个式子分两个部分:上凸的 \(f(x)\),关于 \(x\) 线性的 \(-\lambda x+k\lambda\)。考虑一个上凸函数满足

\[f(x)-f(x-\epsilon)\geq{f(x+\epsilon)-f(x)} \]

其中 \(\epsilon\) 为极小值。而加上一个线性的部分后,对于每个 \(x\)\(f(x)-f(x-\epsilon)\) 不变,\(f(x+\epsilon)-f(x)\) 也不变,所以一个凸的函数加上一个一次函数仍然满足上式条件,即这个函数还是凸的。
总结一下,我们发现 \(f(x)+\lambda h(x)\)\(x\) 确定时关于 \(\lambda\) 线性,当 \(\lambda\) 确定时关于 \(x\) 是上凸的。接下来我们将用这些性质证明对于这个式子交换 \(\min\)\(\max\) 的合理性。
我们先来证明一个条件和结果都更弱的结论:对于任意函数 \(F(x,y)\)

\[\max_{y}\min_{x}F(x,y)\leq{\min_{x}\max_{y}F(x,y)} \]

考虑对于任意 \(x,y\)

\[\min_{x}F(x,y)\leq{F(x,y)} \]

也有对于任意 \(x\)

\[\max_{y}\min_{x}F(x,y)\leq{\max_{y}F(x,y)} \]

从而

\[\max_{y}\min_{x}F(x,y)\leq{\min_{x}\max_{y}F(x,y)} \]

现在我们设 \(F(\lambda,x)=f(x)+\lambda h(x)\),假设对于任意 \(x\)\(\lambda=c\) 时该式的值极小,当 \(\lambda=c\) 时,\(x=d\) 时该式的值极大,那么

\[\max_{x}\min_{\lambda}F(\lambda,x)=F(c,d) \]

现在考虑 \(\min_{\lambda}\max_{x}F(\lambda,x)\),那么 \(F(c,d)\) 一定能在 \(\lambda=c\) 时作为 \(\max_{x}F(c,x)\) 被纳入到可以对外层 \(\min\) 贡献的数中。考虑如果 \(\min\) 不选这个数,他的动机一定是答案比 \(F(c,d)\) 小,但是由上一段的结论,\(F(c,d)\) 不会比答案大,所以 \(F(c,d)\) 即为所求。
至此,我们证明了

\[\begin{aligned} &f(x)\\=&\max_{x}\min_{\lambda}{\{f(x)+\lambda{h(x)}\}}\\=&\min_{\lambda}\max_{x}{\{f(x)+\lambda{h(x)}\}}\\=&\min_{\lambda}g(\lambda) \end{aligned} \]

接下来我们证明 \(g\) 的下凸性。考虑直接带入定义

\[\begin{aligned} &g(\lambda x+(1-\lambda)y)\\=&\max_{c}{\{f(c)+(\lambda x+(1-\lambda)y)h(c)\}} \end{aligned} \]

假设在 \(c=c_0\) 时取到最大,则原式为

\[\begin{aligned} &f(c_0)+(\lambda x+(1-\lambda)y)h(c_0)\\=&\lambda (f(c_0)+x h(c_0))+(1-\lambda)(f(c_0)+y h(c_0)) \end{aligned} \]

由于 \(g(x)\)\(g(y)\) 的最大值不一定在 \(c_0\) 处取到,因此原式的值小于等于 \(\lambda g(x)+(1-\lambda)g(y)\),下凸性得证。
综上所述,我们可以二分 \(g\) 的最小值求解 \(f(x)\)。对于 \(g\) 函数极小值所对应的自变量的范围,也就是我们二分的界,考虑 \(g\) 的自变量 \(\lambda\) 的使命是使得对于每个 \(x\neq k\)\(f(x)+\lambda h(x)\) 不如 \(f(k)\) 优秀。考虑每次 \(x\) 减小或增大 \(1\)\(\lambda h(x)\) 的改变量为 \(\lambda\),对于 \(x<k\) 要求 \(\lambda\) 必须小于 \(f\) 的斜率最小值,这样就能保证每次 \(f(x)\) 移动的增加量被 \(\lambda\) 覆盖。同理,这个上界为斜率最大值。
下面给出一份伪代码以供参考。

\[\begin{array}{l} \textbf{Input. } \text{值 } x \text{ 表示要求 } f(x) \text{ 的点值,}\text{值 } minslope \text{ 是} \text{一个小于 }f\text{ 最小斜率}\\ \text{的值,值 } maxslope \text{ 是一个大于 } f \text{ 最大斜率的值。}\\ \textbf{Output. } f(x)\text{ 的值。}\\ \textbf{Method.}\\ \begin{array}{ll} 1 & left \gets minslope\\ 2 & right \gets maxslope\\ 3 & ans \gets \infty\\ 4 & \textbf{while } left\leq right\\ 5 & \qquad mid=\frac{left+right}{2}\\ 6 & \qquad leftval \gets f'(mid)+mid\times x\\ 7 & \qquad rightval \gets f'(mid+1)+ (mid+1)\times x\\ 8 & \qquad \textbf{if } leftval<rightval\\ 9 & \qquad\qquad ans \gets \min(ans,leftval)\\ 10 & \qquad\qquad right \gets mid-1\\ 11 & \qquad \textbf{else if } leftval>rightval\\ 12 & \qquad\qquad ans \gets \min(ans,rightval)\\ 13 & \qquad\qquad left \gets mid+2\\ 14 & \qquad \textbf{else}\\ 15 & \qquad\qquad \textbf{return }leftval\\ 16 & \textbf{return } ans \end{array} \end{array} \]

Acknowledgement

关于 Acknowledgement

新增此板块,用以感谢对此有帮助的人。
如果您想被 Acknowledge 且未被提到,请评论到任意地方,thx。

感谢 jijidawang 的指导以及机房的小伙伴们在我推崩溃的时候鼓励我。
感谢 wqs 大神的发明。

Reference

你呀你呀(米哈游《原神》2023生日会同人曲)_百度百科
一文看懂拉格朗日乘子法、KKT条件和对偶问题
max-min 不等式(minimax inequality) - CSDN博客
2023.11.7 闲话 - yspm - 博客园
2024.10.15 闲话 - yspm - 博客园
2025.1.1 闲话 - yspm - 博客园
四边形不等式优化 - OI Wiki
【学习笔记】WQS二分详解及常见理解误区解释 - CSDN博客

posted @ 2025-06-06 15:20  Pursuing_OIer  阅读(64)  评论(1)    收藏  举报