其实不用像大部分题解里面写得那么麻烦,如果你需要讨论断点两侧的函数值,那多半是因为没有加入所有的断点(原点和 {x±eps∣x=0,1,2,3} 处的点要强制加进去)。
v.push_back(make_pair(frac(),frac()));
for(int i=1;i<=3;++i)
{
line left=solve(i-1+eps);
line right=solve(i-eps);
v.push_back(make_pair(frac(i-1),left.k*(i-1)+left.b));
solve(left,right);
v.push_back(make_pair(frac(i),right.k*i+right.b));
}
line now=solve(3+eps);
v.push_back(make_pair(frac(3),now.k*3+now.b));
solve(solve(3+eps),r);
(码风可能有些毒瘤,单参数的 solve 接受一个 double 返回当前费用限制下的流量增长函数 line,双参数的 solve 接受两个 line 将这两段函数之间的关键点加入 vector<point> v 中)
然后就可以愉快地两行解决问题咯:
for(unsigned i=1;i<v.size();++i)
ans=ans+(v[i].x+v[i-1].x)*(v[i].y-v[i-1].y)/2;