首页 > 其他分享 >WQS二分学习笔记

WQS二分学习笔记

时间:2024-02-13 12:11:22浏览次数:34  
标签:二分 题意 max WQS 笔记 斜率 dp

WQS二分

WQS二分是一种可以处理一类带有限制的问题的方法,这种限制一般是恰好选 \(k\) 个的形式,而且要求原问题有凸性。

比如函数是上凸的,那么斜率就递减,如果我们去二分这个斜率,那么可以快速求出切点,而切点横坐标代表我们选择了多少个,于是我们就可以根据这个数目和题中要求的\(k\)进行比较,来判断斜率是该变大还是减小。

对于斜率,一般是理解成选择一个物品的额外代价,然后通过dp等方法求出最小值和选择的数量,再进行判断。另外要注意最终切点可能不等于 \(k\),要通过斜率算出等于 \(k\) 时的答案。

一些例题:

最小度限制生成树

即限制一个点的度数必须为\(d\)的最小生成树。可以给所有与这个点相连的边加上额外的权值\(k\),再跑最小生成树,根据这个点的度数判断额外代价是该减小还是增大。

CF739E Gosha is hunting

题意:有\(n\)个神奇宝贝,有\(a\)个宝贝球和\(b\)个超级球,前者抓住\(i\)的概率是\(p_i\),后者是\(u_i\),可以用两种球抓同一只,但每种至多用一个,求抓到神奇宝贝的个数的期望的最大值。

思路:wqs二分。每次二分出一个斜率\(k\),表示每使用一个宝贝球答案就减\(k\),然后求出用多少个超级球。这一步可以直接贪心。每个位置有四种情况,分类讨论一下即可。

[八省联考 2018] 林克卡特树

题意:在树上选出\(k+1\)条不相交的链使得链的边权和最大。

思路:WQS二分+树形DP。看到恰好多少条就想到了WQS二分,二分选出一条链的代价,然后用树形DP算出选出多少条链最优。具体的,设\(dp[i][0/1/2][0/1]\)表示在\(i\)的子树中,点\(i\)的度数为0/1/2,最后的0/1表示是权值还是选了几条链。转移时:

\[\begin{aligned} dp[i][0]&=\max\limits_{k=0}^2dp[j][k]\\ dp[i][1]&=\max(dp[i][0]+dp[j][1]+(w_j,0),dp[i][0]+dp[j][0]+(w_j-mid,1),\max\limits_{k=0}^2dp[i][1]+dp[j][k])\\ dp[i][2]&=\max(dp[i][1]+dp[j][0]+(w_j,0),dp[i][1]+dp[j][1]+(w_j+mid,-1),\max\limits_{k=0}^2dp[i][2]+dp[j][k]) \end{aligned}\]

复杂度:\(O(n\log(n))\)。

April Fools' Problem (hard)

题意:有\(n\)道题,第\(i\)天可以花\(a_i\)准备一道题或者花\(b_i\)打印一道题,每天最多准备一道、打印一道,求最少的准备并打印\(k\)道题的花费。

思路:看到恰好\(k\)道就想到wqs二分,而看起来又很贪心,于是就把两个结合起来。

首先二分一个值\(mid\)表示每次打印的额外花费,然后在每个点有两种决策,准备一道题或者打印前面代价最小的一道题,这个过程可以用堆来维护,于是就可以了。复杂度\(O(n\log n\log V)\)。

P2619 [国家集训队] Tree I

题意:无向图每条边有两种颜色,求恰好有 \(k\) 条白色边的最小生成树。

思路:感性地发现答案关于 \(k\) 是有凸性的,于是考虑用 WQS 二分,二分用一条白色边的额外代价,然后判断选择的白色边个数即可。

标签:二分,题意,max,WQS,笔记,斜率,dp
From: https://www.cnblogs.com/Xttttr/p/18014473

相关文章

  • Go语言精进之路读书笔记第23条——理解方法的本质以选择正确的receiver类型
    和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。receiver参数是方法与类型之间的纽带。Go方法特点:方法名的首字母是否大写决定了该方法是不是导出方法。方法定义要与类型定义放在同一个包内。由此可以推出,不能为原生类型(如int/float64/map等)添加......
  • 根号分治学习笔记
    根号分治根号分治其实一般是广义上的阈值分治,当范围不超过\(B\)时用一种方法,超过\(B\)时用另一种做法。之所以叫根号分治主要是大部分的应用都是在和一定时,不超过\(\sqrt{n}\)的可以把所有\(1\sim\sqrt{n}\)的都处理,超过\(\sqrt{n}\)的最多只有\(O(\sqrt{n})\)个,也......
  • 点分治学习笔记
    点分治点分治是一种处理树上路径问题的常见方法。先引入例题。求树上有多少条路径的长度是3的倍数。点分治的过程是每次找到当前联通块的重心,然后处理所有跨过重心的路径,然后删去重心,递归每个子树再进行处理。根据重心的性质,重心的每个儿子的子树大小都不超过\(\dfrac{n}{......
  • Go语言精进之路读书笔记第22条——使用defer让函数更简介、更健壮
    22.1defer的运行机制在Go中,只有在函数和方法内部才能使用defer。defer关键字后面只能接函数或方法,这些函数被成为deferred函数。defer将它们注册到其所在goroutine用于存放deferred函数的栈数据结构中。在执行defer的函数退出前,按后进先出(LIFO)的顺序调度执行。22.2defer的......
  • Go语言精进之路读书笔记第21条——让自己习惯于函数是"一等公民"
    21.1什么是"一等公民"(1)正常创建//$GOROOT/src/fmt/print.gofuncnewPrinter()*pp{p:=ppFree.Get().(*pp)p.panicking=falsep.erroring=falsep.wrapErrs=falsep.fmt.init(&p.buf)returnp}(2)在函数内创建,定义匿名函数赋值给......
  • Go语言精进之路读书笔记第20条——在init函数中检查包级变量的初始状态
    20.1认识init函数init函数的特点:运行时调用,Go程序中不能显式调用顺序执行,等待一个init函数执行完毕并返回后再执行下一个init函数在整个Go程序生命周期内仅会被执行一次先被传递给Go编译器的源文件中的init函数先被执行,同一个源文件中的多个init函数按声明顺序依次执行。但......
  • 单位根反演学习笔记
    单位根反演\[[n|a]=\dfrac{1}{n}\sum\limits_{k=0}^{n-1}w^{ak}_{n}\]证明:当\(i\not\equiv0\pmodn\)时,由等比数列求和公式可得:原式\(=\dfrac{1}{n}\times\dfrac{w^{an}_n-1}{w^a_{n}-1}\),而右边分子为0,分母不为0,因此和为0。当\(i\equiv0\pmodn\)时,有原式\(=\dfrac{1}{n}......
  • CDQ分治学习笔记
    CDQ分治其实CDQ本质就类似线段树,\(i\)的贡献由\(1\)到\(i-1\)在线段树上拆出的log个节点组成,然后将可以被同一段区间做贡献的点一起计算从而保证复杂度。例题:P3810【模板】三维偏序(陌上花开)题意:对于\(k\in[1,n]\)求三维偏序数量为\(k\)的点的个数。思路:其实就是求每个点的......
  • FWT学习笔记
    FWTFWT即位运算卷积,用来快速计算形如\(\sum\limits_{i\oplusj=k}f_ig_j\),其中\(\oplus\)表示某种位运算。设FWT(A)是幂级数A经过\(\rmFWT\)变换之后得到的幂级数。我们需要令其满足:\(A*B=C\LongleftrightarrowFWT(A)·FWT(B)=FWT(C)\)(点积)。\(\rmFFT\)是......
  • 网络通信基础知识学习笔记
    一.图解网络为什么需要TCP/IP网络模型:为了适应互联网环境下多种多样的设备,设计的一套通用的网络协议对于同一台设备进程间的通信方式:管道,消息队列,共享内存,信号量TCP/IP网络模型的分层:应用层:用户能够直接接触到的层次,互联网软件都是在应用层进行实现.......