醉醺醺的幻想乡
显然第一问直接按照题意最大流。
二次方流量考虑导数。
设f(x)表示每条边单位流量费用≤x的最大流,答案就是对这个函数进行积分。
f是个分段一次函数。这是因为边权费用导数2ax+b是个关于x的一次函数。
f是上凸的。考虑最小割,一个割的代价在x初是个一次函数。
由于a,b≤3,所以斜率只有3n种。
所以f是个段数不超过3n的分段函数。
考虑怎么求出f。可以分治,我们判定当前最左边的一次函数a和最右边的一次函数b交点(c,d),考虑c点的值是否为d。
如果是,则返回,否则中间还有新的半平面。需要得到c处的直线才能继续递归。
考虑如何得到某个点x处的直线。
根据定义,每条边i的流量上界重定为min。
用最大流算法跑实数最大流。
对于一条满流的边(最小割所在边)。
如果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
使用分数类实现斜率/截距的运算。
感觉好玄学。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步