jzoj4882 多段线性函数

31 篇文章 0 订阅

题目描述

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

虽然题目很难看懂,但还是很良心的,因为给了我们一个启发: 峰值是一段区间.
把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; //这里要注意小于等于和小于的区别
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值