jzoj4882 多段线性函数

来源:互联网 发布:糖尿病网络咨询医生 编辑:程序博客网 时间:2024/06/06 04:57

题目描述

这里写图片描述
这里写图片描述

虽然题目很难看懂,但还是很良心的,因为给了我们一个启发: 峰值是一段区间.
把x的取值范围想象为”框”,fmin(y)这个函数就是求y到每个框的最小距离之和.

不难发现fmin(y)是一个不严格的单峰函数,即峰值不止一个点.

因为答案一定是在某个框内或不在框内,
对于第一种情况,在答案[L,R]之间时,左右是平衡的,当y=l-1时,那么右边就多出来一个框,答案变大,右边同理.
对于第二种情况,如果不在框内,换句话说[L,R]中间是没有框的,那么显然L-1必然有框,不然答案就不正确. 对于右边同理,那么进入了一个框,对应的答案就要增加. 可以知道他一定是单峰函数.

如果是单峰函数那就好办了,直接三分求出一个极值点,然后直接倍增求L,R即可.
不过还是打炸了….只有40分,丢个正确的模板上来共参考.

    ll l=0,r=1e9,p1,p2,fp1,fp2;    while (l<r) {        p1=(l*2+r)/3; //不知道为什么p1和p2的取值换一种打法就错了        p2=(l+r*2)/3;        fp1=getf(p1);        fp2=getf(p2);        if (fp2>=fp1) r=p2;else l=p1+1; //这里要注意小于等于和小于的区别    }
0 0
原创粉丝点击