三分算法模板

二分可以在y = kx + b上找答案。(单调递减 , 单调递增)

而三分可以在y = ax^2 + bx + c上找答案。(单峰函数)

我们令:

m1 = l+r >> 1 , m2 = m1 + r >>1; 

然后会有三种情况。

当m1 > m2 , 极值在l ~ m1

当m1 <= m2,极值在m2 ~ r.

then

三分模板:

void tri_search()
{
	int l=0 , r = k,m1(0),m2(0);
	while(l<=r)
	{
		m1 = l+r >> 1 , m2 = m1 + r >>1; 
		if(calc(m1)  > calc(m2)) 
		 r = m2-1;
		else   l = m1+1;
		ans = max(ans , max(calc(m1) , calc(m2)));
	}
}

tips:其实就是m1和m2那边小那边砍

注意每次ans都要和m1和m2取max。

例题:

GMOJ : 6296. 2019.08.12【NOIP提高组A】投票  (File IO):

来自:三分算法模板 - Anion's Blog (web-of-anion.top)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值