A
一棵树,你每天可以选择不超过 \(m\) 个祖先都被选择的点,问最少多少天选完。\(n\le 10^5\)。
考虑贪心,每次选出子树深度最大的 \(m\) 个点或子树大小最大的 \(m\) 个点都是对的。
B
一棵树 \(n\le 5e5\),选若干出来,对于每个点,如果其儿子有选,那么不能被选,否则其有 \(p_u\) 概率被选。
对于每个点 \(u\) 的子树内所有点 \(v\),如果 \(u,v\) 都被选,那么会产生 \(s_v \times a_u\) 的贡献,其中 \(a\) 是给定的,\(s\) 是 01 数组,你要确定 \(s\) 数组使得总的贡献期望最大。
显然期望是 \(\sum s_u\sum_{u \in subtree(v)} p(u\cap v)\),那么对于贡献为正的,取 \(s_u=1\),否则取 \(s_u=0\).
显然 \(p(u)=\prod_{fa_v=u}(1-p(v))\),求 \(p(u\cap v)\) 即令 \(p_u=1\) 并重新 dp 一遍。
考虑从 \(p_u\) 向上爬,即不断令 \(p'_{fa}=p_{fa}\times \dfrac{1-{p'_u}}{1-{p_u}}\),
由于 \(p_{fa}\times (1-p_u)\) 已经是已知的,直接用用矩阵表达出来,顺便记录 \(a_up'(u)\)。
直接前缀矩阵积即可。
C
一个字符串,多次询问某个长度为 \(2^k\) 区间是否满足所有 \(i,j\) 在二进制下的表示是翻转的,\(s_i=s_j\)。
\(n,q\le 5e5\)。
考虑一个区间合法的条件,那么就是这个字符串做蝴蝶变换后跟原字符串相同。
考虑哈希。我们要预处理一个区间和其蝴蝶变换后的哈希值。
定义 \(h(s,bas)\) 为蝴蝶变换后的哈希值,考虑倍增地求蝴蝶变换后的哈希值。
我们想,假设我们 \([0,2^k)\) 和 \([2^k,2^{k+1})\) 的哈希值已经处理好了,现在要合并。
\([0,2^k)\) 的数都要挪到 \(\times 2\) 的位置,\([2^k,2^{k+1})\) 要挪到 \(\times 2+1\) 的位置。
那么,\(h(s_1+s_2,bas)=h(s_1,bas^2)+bas\times h(s_2,bas^2)\)。和 NTT 是不是有点类似。
最后比较原哈希值和 \(h\) 即可。
D
维护序列,支持单点修改,区间查询前 \(k\) 大子区间和的和。
\(\sum k\le 3e5,n\le 1e5\)。
这是超级钢琴。考虑原来的做法是堆里维护每个右端点其左边还剩下的端点区间。
这显然不算优。考虑堆里维护当前还剩左端点在 \([l,r]\),右端点在 \([x,y]\) 的答案。
若 \(l=x,r=y\),就是最大子段和;若 \([l,r]\cap [x,y]=\empty\),分别取 rmq 计算即可。
考虑分割这些矩形即可。