关于WQS二分算法以及其一个细节证明
应用分析
它的作用就是题目给了一个选物品的限制条件,要求刚好选$m$个,让你最大化(最小化)权值,
然后其特点就是当选的物品越多的时候权值越大(越小)。
算法分析
我们先不考虑物品限制条件,
假定我们要最大化权值。
然后其中我们二分一个$C$,表示选一次物品的附加权值,
如果我们$C$越大,我们选的物品个数越多,权值越大,
于是当选的物品个数大于$m$时,减小$C$,否则增大$C$,
最后计算答案的时候去掉$C$值的影响即可。
Updata:这回还是讲一讲算法吧-->理论算法分析
首先我们拿到一个题,然后发现有一个重要的条件:一共有n个数(下面有时候会称为"点"),要求刚好选$m$个,有某种限制,以某种方式计算和(为了表示方便我暂且称$h(x)$表示选第$x$个点的收益),选多少个和怎么选都会影响到答案
同时我们一般可以得到一个关于n和m的dp方程$dp[i][j] = ......$,其中的复杂度一般都是$O(nm)$及以上的,无法接受,但是经过打表发现:设选$j$的数所的到的dp最大值为$g(j)$,然后发现$g(j)$关于$j$的斜率单调不增,也就是一个上凸包
然后如果这题没有刚好选$m$个的限制的时候就可以dp降维的话,那么就可以考虑一下WQS二分
首先我们看一下$g$长什么样子(横坐标$x$表示我选多少个数,纵坐标$g(x)$表示我选$x$个数的情况下最大答案)。显然求出$g(m)$就好了。但是问题是你求不出$g(m)$(时间复杂度高),也就是这个凸包暂时是求不出来的,但是我知道这个形状。
于是我们考虑通过用直线切这个凸包去求$g(m)$。然后构造一条直线,去切这个凸包,显然我可以得到一个最大值(切到的那个点就是当前$x$的最大值),但是这个最大值不一定是取在题目要求的m的,例如我现在令m=7,然后我随便拿一条斜率=$k$的直线去切,但是不是每一条直线都可以使$x=m$:
(为了方便后面我移动了一下$x=7$的点)
我们发现斜率为$k$的直线切这个凸包上的点会切到一些点,每次切到一个点都会切到它的最大值(因为凸包上每一个点都是在固定选多少个数的情况下)
然后我们就可以调整直线的斜率,然后直线就可以切到不同的位置,我们发现由于$g(x)$的斜率单调,所以直线斜率$k$切到的点的$x$同样单调,也就是斜率越大$x$越大。
我们首先假设去枚举一个斜率为$k$的直线,然后我们要求这个切到了凸包的哪个位置,也就是$x$和$g(x)$,我们如何去求这个东西呢?我们发现斜率为$k$直线切到的点在凸包上可以得到一条完整的直线$y=kx+b$,然后其中切到的点的$b$比其它点的$b$都要大,也就是下图:
然后我们知道$b=y-kx$,换句话说$截距=g(x)-k*x$。怎么求出这个斜率呢?我们观察这个式子,式子等价于:设$f(x)$为我在没有固定选多少个点(但是我已经选了x个点)时的答案(也就是截距),一开始不求截距的话$f(x)=g(x)$,如果求截距的话我每选一个点那么$f(x)$就$-=k$,最终的答案$f(x)=g(x)-k*x$,也就是我只要把每个数的$h(x)-=k$然后正常求一下在选任意个数的情况下最大$f(x)$是多少。这个东西用dp去做,一般可以做到$O(n)$,而且dp的同时我们还可以知道当$f(x)$最大的时候的$x$是多少。也就意味着我知道了$g(x)$和$x$了!!!
然后我现在拿着求出来的$g(x)$和$x$,于是就可以知道我二分大了还是小了,最后直到二分到$m$即可。
关于$g(x)$斜率相等,如果不在答案附近那就没有影响,如果在答案附近,那么当我二分出来的$x \geq m$的时候更新答案即可,因为你可以构造出一种合法的方案可以是$x=m$但是答案相等。
问题分析
这看起来是没什么问题的,然而我们考虑一件事情,就是如果我们最终要求$C$是个小数才能刚好选出m怎么办?
有人说:小数二分啊
然而结果是
所以小数二分会导致效率不高。
我们思考一个问题:我们真的需要得到精确的$C$吗?
其实是不需要的,我们只需要在一个那个正确的$C$下的方案即可,因为$C$在最后从答案中减去了。
然而可能出现一种情况,我假定二分到了$mid$,$mid$会使选的物品数为$m-1$,$mid+1$会使选的物品数为$m+1$......
于是我们思考:能不能不二分到小数?
答案是可以的:
我们二分,当$选的物品个数 \geq m$时我们更新答案,同时排序上做点手脚。
为什么?
理论的分析就是上面那张图由于$x$是一个整数,然后你切出来的直线的斜率$k$在一个范围内都是落在同一个$x$点上。
接下来可能是一个比较不理论的证明
基于bzoj2654 tree的证明
题意大概是:
给你一个N个点M条边无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有K条白色边的生成树。
解法就是WQS二分+MST
然而这题的二分就有上面的问题
反证:不存在没有白边黑边相等的情况会出现二分在$mid$和$mid+1$的C不确定
首先:如果没有白边黑边相等,我们假定白边权值为$w_1,w_2,w_3..w_x$,黑边$b_1,b_2,b_3...b_y$,两次枚举的C为为$C_1+1=C_2$,$w_1+C_2 \neq b_1 ...$(所以是$white \geq need$) ...
那么如果发生二分C值无解的情况,那么两个C1,C2($C2=C1+1$)导致的至少选出来的白边数量至少差了2(need-1&&need+1),由于差距大于2的和二的情况在下面等价,所以我们先考虑差距为2
然后由于如果让两条白边与黑边的权值大小关系改变,那么我们至少需要让2条白边+1后的结果分别大于等于2条黑边
所以需要考虑的两种情况就是 有两条白边的权值=两条黑边的权值-1 或 两条白边的权值=两条黑边的权值(基于C1)
注意我们还没有考虑连通性,但是这是必要条件
由于第一种情况直接不符合题设,我们直接忽略,我们考虑第二种情况,这种情况下C可能在C1、C2中间。由于此时的白边权值在C1下等于黑边权值,那么我们可以发现其实C1状态下选黑边白边边权等价。选择导致的不满足K的答案是合法的,因为我们可能会先统计黑边,使得白边没有被统计然后导致不满足K。然而这个问题我们可以直接通过在排序的时候允许第二关键字(按照颜色(这题白色优先))排序使得这种情况合法化。
所以提出的两种无解情况均不存在或者是可以通过算法避免
如果有不严谨出请指正
关于WQS二分算法以及其一个细节证明的更多相关文章
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- [总结] wqs二分学习笔记
论文 提出问题 在某些题目中,强制规定只能选 \(k\) 个物品,选多少个和怎么选都会影响收益,问最优答案. 算法思想 对于上述描述的题目,大部分都可以通过枚举选择物品的个数做到 \(O(nk^2)\ ...
- CF739E Gosha is hunting DP+wqs二分
我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...
- wqs二分
今天模拟赛有一道林克卡特树,完全没有思路 赛后想了一想,不就是求\(k+1\)条不相交的链,使其权值之和最大嘛,傻了. 有一个最裸的\(DP\),设\(f[i][j][k]\)表示在以\(i\)为根的 ...
- BZOJ5252 八省联考2018林克卡特树(动态规划+wqs二分)
假设已经linkcut完了树,答案显然是树的直径.那么考虑这条直径在原树中是怎样的.容易想到其是由原树中恰好k+1条点不相交的链(包括单个点)拼接而成的.因为这样的链显然可以通过linkcut拼接起来 ...
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)
dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...
- WQS二分学习笔记
前言 \(WQS\)二分听起来是个很难的算法,其实学起来也并不是那么难. 适用范围 在某些题目中,会对于某个取得越多越优的物品,限定你最多选择\(k\)个,问你能得到的最优答案. 例如这道题目:[CF ...
- Gym - 101981B Tournament (WQS二分+单调性优化dp)
题意:x轴上有n个人,让你放置m个集合点,使得每个人往离他最近的集合点走,所有人走的距离和最短. 把距离视为花费,设$dp[i][k]$表示前i个人分成k段的最小花费,则有递推式$dp[i][k]=m ...
随机推荐
- vue实战记录(三)- vue实现购物车功能之渲染商品列表
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(三) GitHub:sue ...
- CF24D Broken robot
题目链接 题意 有一个\(n \times m\)的矩阵.机器人从点\((x,y)\)开始等概率的往下,往右,往左走或者不动.如果再第一列,那么不会往左走,再第m列不会往右走.也就是说机器人不会走出这 ...
- usb驱动程序小结(六)
title: usb驱动程序小结 tags: linux date: 2018/12/20/ 17:59:51 toc: true --- usb驱动程序小结 linux中为usb驱动也提供了一套总线 ...
- 分布式监控系统开发【day38】:监控数据如何画图(九)
一.画图代码 1.收集处理数据 class GraphGenerator(object): ''' generate graphs ''' def __init__(self,request,redi ...
- JENKINS针对不同项目组对用户进行权限分配
权限需求 因JENKINS上存有de(开发).te(测试).re(预发布)等三个不同环境的项目,同时因为项目需求,需要对不同的开发及测试人员配置不同的jenkins权限,即以项目为单位,对不同人员进行 ...
- Javaweb学习笔记——(二十七)——————泛型、泛型的通配符、反射泛型信息、反射注解、注解
泛型 1.泛型类:具有一个或多个类型变量的类,称之为泛型类 class A<T>{ } 2.在创建泛型实例时,需要为其类型变量赋值 A<String> a = new ...
- python 写代码笔记 2017.6.15
其实并不是越复杂的代码越好,简单高效才是好. 关键是思路和逻辑,还有多看别人写的代码. 学习到了:)
- luogu P5293 [HNOI2019]白兔之舞
传送门 关于这题答案,因为在所有行,往后跳到任意一行的\(w_{i,j}\)都是一样的,所以可以算出跳\(x\)步的答案然后乘上\(\binom{l}{x}\),也就是枚举跳到了哪些行 如果记跳x步的 ...
- Python3:排序函数sort() 和 sorted() 之介绍
今天来讲一下Python中的排序函数.Python中有2个内建的排序函数,分别为sort() 和 sorted() 下面介绍分别介绍一下2个函数: 1.有一个列表 :a=[1,4,5,88,0,7], ...
- window开发环境常用操作
1. 启动redis命令 redis-server redis.windows.conf 如果法正常启用,出现如下问题 windows下第一次通过以下命令启动redis (*:此处整理转载自:http ...