显然第一问直接按照题意最大流。
二次方流量考虑导数。
设(f(x))表示每条边单位流量费用(leq x)的最大流,答案就是对这个函数进行积分。
(f)是个分段一次函数。这是因为边权费用导数(2ax+b)是个关于(x)的一次函数。
(f)是上凸的。考虑最小割,一个割的代价在(x)初是个一次函数。
由于(a,bleq 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)且(bleq x),则流量一次函数(+=c_i)
如果(2a_ic_i+b_ileq x),则这条边的单位费用不会超过(x),流量一次函数(+=c_i)
否则如果(x)增加(y),则流量一次函数(+=frac{y}{2a_i})
流量一次函数的斜率加上(frac{1}{2a_i})。
同时发现(min(frac{x-b_i}{2a_i},c_i))只有在(xgeq b_i)才能(geq 0)
所以流量一次函数的截距(-=frac{b_i}{2a_i})
对于右边连向t的边,如果满流,则流量一次函数截距(+=f)
使用分数类实现斜率/截距的运算。
感觉好玄学。