AGC043F
下文大概是个人的瞎yy,我不知道为啥别人可以直接把图建出来。
考虑 \(A\) 固定如何处理,我们不难注意到对于这 \(A\) 个珠宝盒,我们确定每个珠宝商处购买的珠宝集合,那么必然是按照大小从小到大顺序排布的(显然有交换后不优)。
先排好序,我们记 \(x_{i,j}\) 表示第 \(i\) 个珠宝商处购买的第 \(j\) 种珠宝的数量的前缀和,那么约束改为:
同时对于第 \(i\) 条约束,对于每个 \(U_i\) 枚举 \(j\),计算得到最大的 \(k\) 使得 \(S_{V_i,k}\le S_{U_i,j}+W_i\)
则有 \(x_{U_i,j}\le x_{V_i,k}\),否则对于 \(j\) 中多余的部分,其将匹配 \(x_{V_i,k+1}\),而这是不被允许的。
于是增加约束:\(x_{U_i,j}\le x_{V_i,k}\)
我们改成标准形,同时增加 \(D\) 表示初值 \(0\):
最小化:\(\sum x_{i,j}(P_{i,j}-P_{i,j+1})\)(设为 \(h_{i,j}\),对于 \(j=0\),令 \(x_{i,0}=D\))
我们发现所有限制都是两个变量一加一减,这意味着在对偶之后(所有的限制变成了点)这些新的变量必然是在每个方程中出现了恰好一次,同时恰好为一次正一次负(新的限制为原来所有的节点)这意味着我们只需要考虑对于每个限制 \(x-y\ge w\),连接一条 \(x\to y\) 且流量为 \(\infty\),费用为 \(w\) 的边。
然后我们从源点对于每个 \(h_{i,j}>0\) 连接 \(S\to (i,j)\) 费用为 \(0\) 流量为 \(h_{i,j}\) 的边即可,对于 \(h_{i,j}<0\) 则连接 \((i,j)\to T\) 费用为 \(0\) 流量下界为 \(h_{i,j}\),上界为 \(\infty\) 的边即可。(注意到之前的建模规定 \(+\) 为流出,\(-\) 为流入)
此时我们转换为求上图中的带上下界最大费用可行流问题(当 \(A\) 足够大的时候上图将产生负环)。
不难注意到 S 的流出 = T 的流入,于是可行流转换为最大流,我们等价于求上图的最大费用最大流问题。
我们考虑枚举 \(A\) 类边的生效次数(这里的次数被定义为 \(+A\) 的经过次数与 \(-A\) 的经过次数之差)并考虑此时的最大流。
我们考虑确定每条边的经过次数,此时可以发现假定存在一种方案使得 \(-A\) 被流过了至少一次,那么由于 \(D\) 必然存在 \(+A\) 的流入,由于同行间 \(x_{i,j}\to x_{i,j-1}\) 的边都是 \(0\),那么我们可以改为流 \(0\) 边然后消去这类 \(-A\) 的贡献。(否则某行若只有 \(-A\) 的贡献却没有 \(+A\) 的贡献则一定不优)
于是我们删去 \(-A\) 类边,此时只需要考虑 \(+A\) 的边的被经过次数 \(z\),由于所有的 \(+A\) 边都流入 \(D\),这启示我们建立一个新的源点 \(S'\),然后我们在上图中加入 \(S'\to D\) 流量为 \(z\) 的边并规定其强行流满,求此时原图中剩余边的最大费用流即可。
我们考虑先在不经过这类边的情况下求出原图的最大费用最大流,此时每条 \(+A\) 边的加入都相当于一次从 \(D\) 开始的增广同时进行了一次退流,不难发现退流的过程中经过的 \(T\) 边集不变,这等价于我们退掉了一条从 \(S'\to S\) 的流量(同时这条边的起点必然是 \(S\to x_{i,K_i}\))。
于是这启发我们将 \(D\) 作为新的源点,然后将 \(S\) 作为汇点,然后保留所有连接 \(S\to x_{i,j}\) 的边(此时需要反向连接),然后保留残余网络中所有的边求解最大费用最大流即可。
然而这样有个问题,假定 \(x_{i,j}\) 不为 \(x_{i,K_i}\) 此时增广路的替换会失效,因为我们少增广了其到某个 \(x_{i,K_i}\) 的路径。
这意味着我们需要强行规定增广路将流至 \(x_{i,K_i}\),这样走的反向边就代表退流,而新加的边则代表初始边到 \(x_{i,K_i}\) 的增广。
然而我们现在难以确定 \(x_{i,K_i}\to T\) 的边的流量,不过我们可以直接令 \(x_{i,K_i}=T\)!不难发现这恰好对应着我们前面的所有条件。
现在我们已经可以在 \(\mathcal O(\sum P_{i,K_i}\times nm+q\log )\) 的复杂度解决本题了,不过看上去需要做两次网络流还是很麻烦的,有没有更好的性质呢?
我们可以发现初始图上的答案为 \(0\),且存在一种简易的增广方式:
对于所有源点出发的点,流 \(0\) 边,流至一个流向汇点的边为止。(显然每一行都可以这样增广增广完)
此时我们只需要考虑确定 \(0\) 边的经过次数,不难发现一条 \(x_{i,j}\to x_{i,j-1}\) 的边会被经过恰好 \(P_{i,j}\) 次,所以我们可以初始连边直接改为 \(x_{i,j-1}\to x_{i,j}\) 一条 \((P_{i,j},0)\) 的边。
然后我们增广 \(\sum P_{i,K_i}\) 次求解答案(也可以直接进行多次增广直到最短路变换为止,这样的复杂度同 dinic 费用流)即可。
查询上只需要考虑增广多少次会使得 \(A\) 不再流,这意味着取反边权后的最小费用可行流中的最短路径的长度大于 \(A\) 时将停止增广,这个 Part 可以通过 lower_bound 处理,复杂度 \(\mathcal O(q\log n)\)
另:当 \(A\) 足够大的时候,此图上将存在一个正环,此时将持续增广,对应着无解的情况。