[DP&DS] UOJ#730. 【JOISC2022】蚂蚁与方糖

题意

数轴上初始为空,有 \(q\) 个操作,一次操作是在数轴上整点 \(x\) 处放置 \(a\) 个红或蓝点。

初始给出一个整数 \(L\),意义是:距离不超过 \(L\) 的一对红点与蓝点会连无向边。你需要在每次操作后输出这个图的最大匹配数。

\(q \leq 5\times 10^5\), \(a,L \leq 10^9\)

题解

独立胡出来了,难度不大,但很有意思,是道爽题。


为方便表述,下文记 \(R_i,B_i\) 分别表示坐标 \(\leq i\) 红/蓝点个数。

Hall 定理转为选若干不交区间(这里一个区间是连续一段红点的管辖区间并)\([l_i,r_i]\),最大化下式:

\[\begin{aligned} &\sum_{i}(R_{r_i}-R_{l_i-1})-\sum_{i}(B_{r_i+L}-B_{l_i-L-1})\\ =&\sum_{i}(B_{l_i-L-1}-R_{l_i-1})+(R_{r_i}-B_{r_i+L})\\ =&\sum_{i}p_{l_i}+q_{r_i}\\ \end{aligned} \]

其中 \(p_i = B_{i-L-1}-R_{i-1}\)\(q_i = R_{i} - B_{i+L}\)。那也就是说我要交替选取一些 \(p\)\(q\) 使得权值和最大。直接对数轴建立线段树,每个节点上维护 \(f_{0/1,0/1}\) 表示区间内以 \(p\)/\(q\) 开头,\(p\)/\(q\) 结尾的序列的权值最大值。

那我们考虑修改时如何维护,不难发现 \(p,q\) 数组支持单点修改了。两种修改是本质不同的,需要分类讨论。

  • 加入红点

相当于对 \(p[x+1,+\infty]\) 后缀 \(-a\)\(q[x,+\infty]\) 后缀 \(+a\)

看似不好处理,但我们发现对 \(p,q\) 的同一段区间进行一个 \(+a\),一个 \(-a\) 的操作时,某个决策的改变量至于 \(p,q\) 个数差有关,而这在 \(f\) 中已经做过记录,故 \(f\) 的四个决策并不会改变,其变化只是简单的区间加。那么就可以把这个操作拆成 \(p,q\)\([x,+\infty]\) 区间一个 \(+a\),一个 \(-a\),然后 \(p_x\) 单点修改。

  • 加入蓝点

相当于对 \(p[x+L+1,+\infty]\) 后缀 \(+a\)\(q[x-L,+\infty]\) 后缀 \(-a\)

同理拆成可做的 \([x+L+1,+\infty]\) 的一加一减,和 \([x-L,x+L+1]\) 的区间加。后面一个东西就与 \(p,q\) 的个数和有关了,这咋处理?

发现对于 \([x-L,x+L+1]\) 的任意一个子区间,我不可能选出三个及以上的 \(p\),因为如果选了三个 \(p_x,p_y,p_z\)\(x<y<z\),则 \([p_y-L,q_y+L]\) 必然会被 \([p_x-L,q_x+L]\)\([p_z-L,q_z+L]\) 的区间并给覆盖,这是不优的:直接去掉 \(y\),红点区间并不变,而蓝点贡献变少。

那么给长度 \(\leq 2L+1\) 的区间的 \(f\) 多加一维 \(k\) 记录区间里选了 \(k\)\(p\) 时的最优决策即可,复杂度 \(O(n \log n)\)

posted @ 2022-07-26 13:48  Ilith  阅读(232)  评论(0编辑  收藏  举报