[JOISC 2022] Sugar and Ants

Tag: Hall 定理,线段树(ddp?)

这种吊题是人类能想出来的吗。

首先题目可以转成二分图匹配的形式:给定左部点集合 \(S\) ,右部点集合 \(T\) ,每个左部点 \(p\) 可以匹配范围为 \([p-L,p+L]\) 的右部点。每次操作会指定一个左部点或右部点,将其权值加一个正数。问每次操作后的最大匹配数。

方便起见,我们对所有操作离散化,并约定总点数 \(n = Q\)

\(O(n^2\sqrt{n})\) 的 dinic 做法就不说了。

首先你需要知道 Hall 定理的一个推论:对于由集合 \(S\)\(T\) 组成的二分图,其最大匹配为 $$|S| - \sum\limits_{V \subseteq S} \max(|V| - |N(V)|)$$ 。

假设坐标集合 \(P\) 覆盖的全部左部点构成子集 \(V\) 。我们考察集合 \(P\) ,做一些基础观察。

$\mathrm{Observation ; 1:} $ \(P\) 由若干相邻距离大于 \(2L\) 的区间构成。

证明是容易的。如果存在两个相邻区间的距离 \(\le 2L\) ,那么把这两个区间之间的所有点都选中只会让 \(|V|\) 增大,是一定不劣的。

设位置 \(i\) 的左部点权值为 \(a_{i}\) ,右部点的权值为 \(b_{i}\) 。借助于这个观察,不难写出 \(\max(|V| - |N(V)|)\) 的形式化表达:

\[\sum_{i} (\sum_{j \in [l_{i},r_{i}]} a_{j} - \sum_{j\in [l_{i} - L,r_{i} + L]} b_{j}) \]

其中 \([l_{i},r_{i}]\) 表示坐标集合 \(P\) 包含的区间。

上面的式子仍然不好求最大值。稍作转换,设 \(A_{i},B_{i}\)\(a,b\) 的前缀和,对上面的式子做差分:

\[\sum_{i} (A_{r_{i}} - A_{l_{i}-1} - B_{r_{i}+L} + B_{l_{i}-L-1}) \]

发现一个点充当区间端点时,贡献的形式是固定的:对于点 \(i\) ,充当左端点的贡献为 \(B_{i-L-1}-A_{i-1}\) ,右端点的贡献为 \(A_{i} - B_{i+L}\) 。问题转化为选取若干位置,让其交替成为左右端点且相邻点距离大于 \(2L\) ,求上式的最大值。

要实现区间查和单点加,考虑线段树维护上述信息。设 \(f_{0/1,0/1}\) 表示区间最左端/最右端的节点作为左端点/右端点时的最大值。修改一个点的点权等价于修改往后所有点的前缀和。由于单次修改带来的影响只依赖于两种端点的数量差,因此这样维护可以包含区间内部的全部信息。

刻画一下操作带来的影响:

  • 对编号为 \(x\) 的左部点权值加 \(y\) :其等价于将 \([x,n]\)\(A\) 全部加 \(y\) ,其会使 \((x,n]\) 内的左端点 \(-y\)\([x,n]\) 内的右端点 \(+y\) 。这一部分只需要维护 \(f_{0,0}\) ,\(f_{1,1}\) 的区间加就可以,因为剩余状态的贡献会抵消。

  • 对编号为 \(x\) 的右部点权值加 \(y\) :有一段后缀的维护与上面类似,还有一个维护是对于 \([x-L,x+L]\) 内的所有右端点要 \(-y\) 。发现区间长度小于 \(2L\) ,理论上区间内部最多只会有一个区间,于是退化成关于 \(f_{0,0},f_{1,1},f_{0,1}\) 的单点修。区间打标记即可。

离散化以后维护上述操作,时间复杂度 \(O(Q\log Q)\)

posted @ 2026-06-19 22:39  QFTheory  阅读(1)  评论(0)    收藏  举报