题解 P1883 【函数】

· · 题解

方法一:二分答案

本题的关键是二分答案。由于输出只要求精确到4位,我们可以二分结果。设结果为ans,对于二分得到的任何一个值mid,我们可以计算出每条二次函数值低于它的区间。如果mid < ans,那么刚才所说的那些区间的交集为空,如果mid > ans 那么刚才所说的那些区间的交集就不为空了。

所以现在我们只需要进行二分搜索答案ans,每次通过把数带入二次函数计算出每个二次函数所对应的区间,然后判断这些区间的交集是否为空即可。判断区间交集是否为空可以直接判断他们最左的右端点是否在最右的左端点右边即可。每次二分判断的时间复杂度为O(n),整个算法的时间复杂度为O(pn), p为二分的次数。

方法二:三分求最值

容易看出,因为a的取值为大于等于0,二次函数的开口向上,所以F(x)的函数图像也是开口向上的,先单调递减再单调递增,于是可以用三分法求二次函数的最值。与二分查找算法类似,先取整个区间的中间值mid=(left+right)/2再取右侧区间的中间值midmid,从而把区间分成三个小区间midmid=(mid+right)/2如果mid比midmid更靠近最值点,我们就舍弃右区间(midmid + 1 ~ end),否则我们就舍弃左区间(left ~ mid - 1).

比较mid与midmid谁更靠近最值,只需要确定mid所在的函数值与midmid所在的函数值的大小。当最值为最大值时,mid与midmid中较大的那个自然更为靠近最值。最值为最小值时同理

——————by stranded

当然,以上两种方法都是对于a>=0的情况适用的。如果把题目中的0<=a<=100改为0<=|a|<=100,那么只能在二分答案的基础上,用离散化线段树来判断交集。对于本题,这是一种一般性最强的解法 ——————by litc