关于WQS二分 , 是用来解决这样一类问题
强制选k个某属性的物品,要求最优方案。
[国家集训队2]Tree I
题目描述
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。
输入输出格式
输入格式:
第一行V,E,need分别表示点数,边数和需要的白色边数。
接下来E行
每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。
输出格式:
一行表示所求生成树的边权和。
输入输出样例
输入样例#1:
1 | 2 2 1 |
输出样例#1:
1 | 2 |
说明
0:V<=10
1,2,3:V<=15
0,..,19:V<=50000,E<=100000
所有数据边权为[1,100]中的正整数。
By WJMZBMR
题解
这道题是WQS二分的经典题目
我们二分白边边权增量,对于每次二分后排序做Kruskal最小生成树。边权相同优先让白边靠前。
这样显然减少增量白边会多,增加增量白边会少。
我这样写后交上去并不对,代码如下
1 | // luogu-judger-enable-o2 |
但是这会有一个问题,白边优先意味着当前状况可能尽管白边数大于黑边数,但是完全可以用黑边替换白边。那么我们可以只要当前白边数够大就更新答案。
为什么这个做法是正确的呢?因为我们在白边数大的时候还会给白边更大的增量,假如依然白边数>=指定边数,那么说明原来那种是不能用黑边替换的或者和原来的情况一样或者比原来的情况更优。不管怎么样都能更新答案,只要一直保证白边数不小于黑边,就能确保最后的答案是正好need条白边(由数据保证)。
Code:
1 |
|
[SHOI2014]概率充电器
题目描述
著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品—— 概率充电器:
“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决 定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看 吧!”
SHOI 概率充电器由n-1 条导线连通了n 个充电元件。进行充电时,每条导 线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率 决定。随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行 间接充电。
作为SHOI 公司的忠实客户,你无法抑制自己购买SHOI 产品的冲动。在排 了一个星期的长队之后终于入手了最新型号的SHOI 概率充电器。你迫不及待 地将SHOI 概率充电器插入电源——这时你突然想知道,进入充电状态的元件 个数的期望是多少呢?
输入输出格式
输入格式:
第一行一个整数:n。概率充电器的充电元件个数。充电元件由1-n 编号。
之后的n-1 行每行三个整数a, b, p,描述了一根导线连接了编号为a 和b 的 充电元件,通电概率为p%。
第n+2 行n 个整数:qi。表示i 号元件直接充电的概率为qi%。
输出格式:
输出一行一个实数,为能进入充电状态的元件个数的期望,四舍五入到小 数点后6 位小数。
输入输出样例
输入样例#1:
1 | 3 |
输出样例#1:
1 | 1.000000 |
输入样例#2:
1 | 5 |
输出样例#2:
1 | 4.300000 |
说明
对于30%的数据,n≤5000。
对于100%的数据,n≤500000,0≤p,qi≤100。
题解
这道题是道不错的概率DP入门题
显然对于每个点,我们要考虑它自己亮的概率,被它父亲点亮的概率,被他孩子点亮的概率.
为了高效率,显然我们可以进行树形DP
显然这个题概率不好正着推,WZX大佬说这题随便正着推,真是太强啦!
我们设
表示x不被子树节点点亮的概率,不被子树外点亮的概率。
比较好推
其中
表示子节点连向父亲的导线通电的概率。
对于
转移,我想了好久,其实十分的简单。
我们先求出父亲不被外部点亮的概率
这就是一个点最终对于孩子节点没有电的概率。
因此
类似刷表法的down过程就结束了
这就是树形dp的 up and down
Code:
1 |
|
多人背包
题目描述
求01背包前k优解的价值和
输入输出格式
输入格式:
第一行三个数K、V、N
接下来每行两个数,表示体积和价值
输出格式:
前k优解的价值和
输入输出样例
输入样例#1:
1 | 2 10 5 |
输出样例#1:
1 | 57 |
说明
对于100%的数据,
题解
这是道好题。
对于背包问题,显然每件物品是独立的子问题。
很容易发现,我们需要记录用其他物品来填充背包是否能得到更优解.
因此我们需要记录一个变量c1表示体积为j的时候的第c1优解能否被更新.
再去记录一个变量c2表示体积为j-v[i]的时候的第c2优解.
更新到k就可以的(雾
Code:
1 |
|
[SCOI2003]严格N元树
递推的好题
题目描述
如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树。如果该树中最底层的节点深度为d(根的深度为0),那么我们称它为一棵深度为d的严格n元树。例如,深度为2的严格2元树有三个,如下图:
给出n, d,编程数出深度为d的n元树数目。
输入输出格式
输入格式:
仅包含两个整数n, d(0<n<=32, 0<=d<=16)。输入数据保证你不需要考虑某一层多于1024个节点的树(即nd<=1024)。提示:答案保证不超过200位十进制数。
输出格式:
仅包含一个数,即深度为d的n元树的数目。
输入输出样例
输入样例#1:
1 | 2 2 |
输出样例#1:
1 | 3 |
输入样例#2:
1 | 2 3 |
输出样例#2:
1 | 21 |
输入样例#3:
1 | 3 5 |
输出样例#3:
1 | 58871587162270592645034001 |
题解
这个题有巧妙地构造递推方式,也有相当理性的组合数学方法,主要考虑巧妙地构造方式。
很好想的想到深度不超过d的数量设为
, 最后答案是
然后很好想到每次深度多一我们只需要在最上面加一个根,那么根上还得有(n-1)颗子树。因此
于是很简单地就AC了
Code:
1 | // luogu-judger-enable-o2 |