【___】___

from 神/se

题面

\(n\) 个箱子排成一行,第 \(i\) 个箱子里最多能装 \(a_i\) 个球。

还有 \(m\) 个人,第 \(i\) 个人手里有 \(c_i\) 个球,并且可以往编号在 \([l_i,r_i]\) 中的箱子放球。

每个人还有一个类型 \(t_i\in\{0,1\}\)

\(x=1,\cdots,n\) 求出:若将所有 \(t_i=1\) 的人的限制范围改成 \(l'_i=\min(x,l_i)\)\(r_i'=\max(r_i,x)\),那么最多能放多少个球。

\(n,m\leq 2\times 10^5\)\(a_i,c_i\leq 10^9\)

题解

\(t_i\) 全等于 \(0\),相当于左边每个点能匹配右边一个区间的二分图匹配问题,贪心即可做到 \(O(n\log n)\):从小到大枚举右边的所有点 \(x\),过程中将 \(l\leq x\) 的所有区间加入一个堆中,堆顶是 \(r\) 最小的,那么每次 \(x\) 肯定优先匹配堆顶。

但对于这题,我们考虑利用 Hall 定理求解,答案可表示为:

\[\sum_{i=1}^{m}c_i-\max_{S\subseteq\{1,\cdots,n\}}(c(S)-N(S)) \]

\(N(S)\) 表示 \(S\) 能放的箱子的 \(a_i\) 之和。

注意到 \(N(S)\) 一定是若干段两两不交的区间构成,加上一个新的不交的区间 \([L,R]\) 会使权值加上所有 \([l_i,r_i]\)\([L,R]\) 内部的 \(c_i\) 再减去 \(\sum_{j=L}^Ra_j\)

\(pre_i\) 表示只考虑那些 \(t_j=0\) 的人,且 \(N(S)\)\([1,i]\) 范围内的 \(\max\limits_{S\subseteq\{1,\cdots,n\}}(c(S)-N(S))\)。同理设 \(suf_i\)

使用线段树对每个 \(j\) 维护 \(pre_{j-1}+C[j,i]-N(j,i)\) 即可 \(O(n\log n)\) 计算 \(pre\)\(suf\),其中 \(C[L,R]\) 表示所有 \([l_i,r_i]\)\([L,R]\) 内部的 \(c_i\) 之和。

现在考虑对于某 \(x\) 计算答案。考虑 \(S\)\(t_i=1\) 的那些区间,它们肯定都在 \(N(S)\) 中同一个包含 \(x\) 的区间内,那么答案为:

\[\sum_{i=1}^mc_i-\max_{L\leq x\leq R}\bigg(C[L,R]-\sum_{i=L}^Ra_i+pre_{L-1}+suf_{R+1}\bigg) \]

考虑分治。计算跨过 \(mid\) 的区间 \([L,R]\)\(x\) 的贡献,其中 \(L_{\lim}\leq L\)\(R\leq R_{\lim}\)

具体地,计算 \(f_L\) 表示 \(\max\limits_{R\in[mid+1,R_{\lim}]}\bigg(C[L,R]-\sum_{i=L}^Ra_i+pre_{L-1}+suf_{R+1}\bigg)\),然后对每个 \(x\in[L_{\lim},mid]\)\(\max\limits_{L\in[L_{\lim},x]}f_L\) 更新。对于 \(x\in [mid+1,R_{\lim}]\) 的更新同理。

\(g_R=\left(C[L,R]-\sum_{i=L}^Ra_i+pre_{L-1}+suf_{R+1}\right)\)。那么随着 \(L\) 变小,我们要做的是对 \(g_R\) 后缀加以及问 \(g_R\) 全局 \(\max\)

注意到总共只会有 \(O(n)\)\(g_R\) 的后缀加(每个区间 \([l_i,r_i]\) 只会在跨过 \(mid\) 时贡献一次),那么直接用线段树维护即可。总时间复杂度 \(O(n\log n)\)

posted @ 2022-10-28 18:24  ez_lcw  阅读(23)  评论(0)    收藏  举报