第五十七次
A
?
B
设 $f_{i,0/1/2}$ 表示 $[1,i]$ 形成的,以 $i$ 结尾的 / 以 $i-1$ 结尾的 / 总共的排列方案数。
C
两维独立,问题变为给一堆线段,每个线段可以选中间或两边,求选出的东西之交最大是多少。
按端点把数轴分段,则钦定任意一段在最终的交中,就可以确定所有线段的选择方案。
定义 $f(i)$ 表示钦定 $i$ 段在最终的交中时交的大小,则答案为 $\max f(i)$。
考虑从左往右依次钦定每段在最终的交中,则所有线段初始都选两边,
钦定到一条线段内部时这条线段切换为选中间,再次钦定到一条线段外部时这条线段切换为选两边。
Sol 1
考虑扫描时,线段树维护当前选择方案下,每段被覆盖多少次。
则切换选择方案相当于区间加减,当前 $f(i)$ 为 $n$ 的个数。
被卡常了,恼。
Sol 2
考虑哈希当前选择方案,对每条线段随机赋权,线段 $i$ 的权值 $v_i$ 为 $\begin{cases}a_i&i\text{ 在当前方案中选中间}\\b_i&i\text{ 在当前方案中选两边}\end{cases}$,其中 $a_i,b_i$ 随机生成,
则钦定 $i$ 段必选时,选择方案的哈希值 $h_i$ 为 $\sum v_j$,于是 $f(i)$ 即为哈希值与其相同的段的长度之和。
D
分治。钦定左半区间“占大头”,即左半区间合并后的最高位 $h_l$ 不低于右半区间合并后的最高位 $h_r$,
此时对左端点 $l\le mid$,可以发现 $\sum\limits_{i=l}^ra_i=2^{h_l+1}$ 的 $r>mid$ 恰为此钦定下能与 $l$ 合成合法区间的 $r$。
所以只需对每个 $l$ 统计 $\sum\limits_{i=mid+1}^ra_i=2^{h_l+1}-\sum\limits_{i=l}^{mid}a_i$ 的 $r$ 的个数,把每个 $r$ 的 $\sum\limits_{i=mid+1}^ra_i$ 装进桶里即可。
但你发现它太大了装不进桶里,于是模一个大质数就行了。
右半区间“占大头”同理,注意两边最高位相同的区间会被重复算。