wqs 二分学习笔记&做题记录

一直以为是什么很难的算法。。

wqs 二分解决的就是形如“恰好选 \(k\) 个的最大值” 这样的问题。

具体而言就是恰好 \(k\) 个这个条件很难搞时,对数据做一个偏移量,也就是所有数都去加上 \(x\) ,然后去掉这个条件跑最优解,这样得到的最优解选了几个计算一下,可以发现这个 \(x\) 会对最后选了几个造成影响,而且是单调的,那么就可以二分了。

它的原理是啥呢,就是说假设每种选择方案对应这个偏移量 \(x\) 是一个一次函数,那么显然有一个最低点,而一个 \(x\) 对应的最低点的就可以二分去找了。


来个例题。

P2619

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有 \(need\) 条白色边的生成树。

\(n\le 5\times 10^4,m\le 10^5\)

典题,考虑如果去掉恰好这个条件就是直接最小生成树。

考虑如果偏移量加在什么上面,容易发现把所有白边边权全部加上 \(x\) 后选白边自然会变小,而且这是单调的,所以直接二分即可。

很多博客都用什么凸包什么的进行讲解,我认为是把简单的思想复杂化了。


P3620 \(\color{green}\bigstar\)

有一个长度为 \(n\) 的序列 \(a\),选出 \(k\) 个数,满足这 \(k\) 个数两两不相邻且和最大。

\(n\le 5\times 10^5,2k\le n,1\le a_i\le 10^9\)

不是很难的题。

如果没有限制可以直接 dp,有限制暴力是直接加一维。

一个比较显然的思路是全体加上 \(x\),这样选出数的数量就会产生单调的影响,因此直接二分即可。

code

另一个做法是反悔贪心,code


ABC218H *2805 \(\color{green}\bigstar\)

\(n\) 盏灯,选择 \(k\) 盏点亮,如果 \(i\)\(i+1\) 状态不一样就可以获得 \(a_i\) 的得分,求最大得分。

\(n\le 2\times 10^5,1\le a_i\le 10^9\)

考虑第 \(i\) 个灯对答案的最大贡献为 \(a_i+a_{i-1}\),可以发现选择不连续的点一定最优,但如果 \(k\) 很大无法满足这个条件,因此取一个 \(k=\min (k,n-k)\) 即可。

然后就和上面一个问题一样了。

code


太菜了,咕咕咕。

posted @ 2022-07-10 18:55  houzhiyuan  阅读(54)  评论(0编辑  收藏  举报