参考博客:https://blog.csdn.net/beiyouyu/article/details/7875480

概念

在二分查找的基础上,在右区间(或左区间)再进行一次二分,这样的查找算法称为三分查找,也就是三分法。

三分查找通常用来迅速确定最值。

三分法所面向的搜索序列的要求是:序列为一个凸性函数。通俗来讲,就是该序列必须有一个最大值(或最小值),在最大值(最小值)的左侧序列,必须满足不严格单调递增(递减),右侧序列必须满足不严格单调递减(递增)。如下图,表示一个有最大值的凸性函数:

算法过程

1⃣️先取整个区间的中间值mid。

int mid=(l+r)>>1;

2⃣️再取右侧区间的中间值rmid,从而把区间分为三个小区间。

int rmid=(mid+r)>>1;

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

ll t1=Calc(mid),t2=Calc(rmid);//若求最大值则<,min取max
if(t1>t2) l=mid;
else r=rmid;
ans=min(ans,min(t1,t2));

模板

感谢学长的模板orz

ll Calc(ll x)//取最小值
{
}
ll Tsearch(int l,int r)
{
    ll ans=min(Calc(l),Calc(r));
    while(l<r)
    {
        int mid=l+r>>1;
        int rmid=mid+r>>1;
        ll t1=Calc(mid),t2=Calc(rmid);
        if(t1>t2) l=mid;//若求最大值则<,min取max
        else r=rmid;
        ans=min(ans,min(t1,t2));
    }
    return ans;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

CodeForces939E 三分 Previous
CodeForces954E 思维 Next