关于积分
查看原帖
关于积分
383524
阿陶陶陶楼主2022/7/26 18:51

其实不用像大部分题解里面写得那么麻烦,如果你需要讨论断点两侧的函数值,那多半是因为没有加入所有的断点(原点和 {x±epsx=0,1,2,3}\{x\pm 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));	//i-1右侧的点
	solve(left,right);
	v.push_back(make_pair(frac(i),right.k*i+right.b));		//i左侧的点
}
line now=solve(3+eps);
v.push_back(make_pair(frac(3),now.k*3+now.b));	//3右侧的点
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;
2022/7/26 18:51
加载中...