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