由于Hany01比较菜,也比较懒,有些题目不想写了,于是搞了个口胡题集。。
[CF97E] Leaders(双连通分量)
Description
给定一张无向图,每次询问 之间是否存在长度为奇数的路径。
Solution
先搞出每个联通块的生成树。如果 不在同一个联通块就直接判掉。如果在生成树中的距离为奇数,直接输出Yes。剩下的就只要考虑是否有边被奇环包含了。
结论:点双连通分量中如果存在一个奇环,那么每一条边都至少被一个奇环所包含。
我们跑出点双后,如果存在奇环,将所有除最顶端以外的点标记为1(即把所有在点双中的树边标记为1)。
最后处理询问时只要检查路径上是否存在被标记的边即可(对标记累个前缀和,
)。
[BZOJ4753][JSOI2016] 最佳团体(分数规划,树上背包)
Description
给定一棵树,每个点都有一个费用和价值。要求选不超过 个点,使得总价值除以总费用最大。
Solution
二分答案 ,即判断 ,将权值变成 ,求选出来的点的权值和是否不小于 即可。
[BZOJ3687] 简单题(背包,bitset)
Description
给定一个数的集合
,求所有子集的和的异或和。
Solution
先考虑一个暴力的背包DP,设
和为
的的子集个数,那么有转移:
。由于我们只要考虑奇偶,所以可以用0/1来表示
,并将加法运算改成异或运算。接着我们可以用std::bitset
来优化这个转移,因为bitset
可以方便的左移,将
左移
位就可以转移到
了。最后对于每个
,将答案异或上
即可。
[Hihocoder1167] 高等理论计算机科学(树剖)
Description
给定一棵树和很多条链,问有多少对链是相交的。
Solution
考虑将链依次加入,将链上的点权都+1,链上的边权都-1。计算有多少条链与新加入的链相交,只要搞出新链上的权值和即可。