[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]\),最大化下式:
其中 \(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)\)。