醉醺醺的幻想乡

显然第一问直接按照题意最大流。
二次方流量考虑导数。
\(f(x)\)表示每条边单位流量费用\(\leq x\)的最大流,答案就是对这个函数进行积分。
\(f\)是个分段一次函数。这是因为边权费用导数\(2ax+b\)是个关于\(x\)的一次函数。
\(f\)是上凸的。考虑最小割,一个割的代价在\(x\)初是个一次函数。
由于\(a,b\leq 3\),所以斜率只有\(3n\)种。
所以\(f\)是个段数不超过\(3n\)的分段函数。
考虑怎么求出\(f\)。可以分治,我们判定当前最左边的一次函数\(a\)和最右边的一次函数\(b\)交点\((c,d)\),考虑\(c\)点的值是否为\(d\)
如果是,则返回,否则中间还有新的半平面。需要得到\(c\)处的直线才能继续递归。
考虑如何得到某个点\(x\)处的直线。
根据定义,每条边\(i\)的流量上界重定为\(\min(\frac{x-b_i}{2a_i},c_i)\)
用最大流算法跑实数最大流。
对于一条满流的边(最小割所在边)。
如果\(a_i=0\)\(b\leq x\),则流量一次函数\(+=c_i\)
如果\(2a_ic_i+b_i\leq x\),则这条边的单位费用不会超过\(x\),流量一次函数\(+=c_i\)
否则如果\(x\)增加\(y\),则流量一次函数\(+=\frac{y}{2a_i}\)
流量一次函数的斜率加上\(\frac{1}{2a_i}\)
同时发现\(\min(\frac{x-b_i}{2a_i},c_i)\)只有在\(x\geq b_i\)才能\(\geq 0\)
所以流量一次函数的截距\(-=\frac{b_i}{2a_i}\)
对于右边连向t的边,如果满流,则流量一次函数截距\(+=f\)
使用分数类实现斜率/截距的运算。
感觉好玄学。

posted @ 2021-02-14 09:38  celerity1  阅读(144)  评论(0编辑  收藏  举报