整数二分

我们可以做到每次排除一半的答案,时间复杂度 \(O(\log n)\)。

long long l = L, r = R;
while(l <= r) {
long long mid = (l + r) >> 1;
if(mid > x) r = mid - 1;
else l = mid + 1;
}
long long ans = l;

实数二分

我们规定一个精度 \(eps\),以此达到整数二分的效果,时间复杂度为 \(O(\log \frac{R-L}{eps})\)。

为了防止精度过度导致死循环,我们可以限制二分次数,如限制为 \(100\) 次。

实际应用

  1. 实现求解连续函数的零点(近似解)。

  2. \(0/1\) 分数规划。

  3. 最小比值生成树。

三分法

三分法衍生自二分法,三分法求单峰函数的峰值。

算法流程

设当前搜索域为 \([l,r]\),取该区间的三等分点 \(\text{lmid,rmid}\)。

若满足 \(f(\text{lmid})<f(\text{rmid})\),则可以排除 \([l,\text{lmid}]\)。

若满足 \(f(\text{lmid})=f(\text{rmid})\),则可以排除 \([l,\text{lmid}] \cup [\text{rmid},r]\)。

若满足 \(f(\text{lmid})>f(\text{rmid})\),则可以排除 \([\text{rmid},r]\)。

实数三分

double l = L, r = R;
for(int i = 1; i <= 100; i ++) {
double lmid = l + (r - l) / 3, rmid = r - (r - l) / 3;
if(f(lmid) < f(rmid)) l = lmid;
else r = rmid;
}
double ans = f(l);

整数三分

long long l = L, r = R;
while(r - l > 3) {
long long lmid = l + (r - l) / 3, rmid = r - (r - l) / 3;
if(f(lmid) < f(rmid)) l = lmid;
else r = rmid;
}
long long ans = f(l);
for(int i = l + 1; i <= r; i ++) ans = max(ans, f(i));

算法优化

考虑计算时间复杂度,由于每次搜索域缩减到 \(\frac{2}{3}\)。

因此时间复杂度为 \(O(\log_{\frac{3}{2}} \frac{R - L}{eps})\)。

我们完全可以将 \(\text{lmid}\) 和 \(\text{rmid}\) 不断接近,以此达到使 \(\log\) 的底数无限接近 \(2\)。

应用场景

在单峰性/单谷性能够证明的题目中,三分法都能高效地适配。

Day 1 - 二分的更多相关文章

  1. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  2. BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3352  Solved: 919[Submit][Stat ...

  3. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  4. [bzoj2653][middle] (二分 + 主席树)

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...

  5. [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二

    Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...

  6. [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  7. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  8. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

  9. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  10. 2016 ACM/ICPC Asia Regional Dalian Online 1008 Function 二分+RMQ

    Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

随机推荐

  1. win10激活方法

    slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX slmgr /skms zh.us.to slmgr /ato

  2. Sed 日常使用介绍

    Sed 日常使用介绍 简介 sed 是 unix 环境下常用的流处理工具, 可以处理字符流, 文件或者二进制文件流. 各个 unix/linux 发行版都会配备 sed 及其衍生的命令工具, 因此, ...

  3. Native如何使用Tunnel Mode

    mAudioSessionId = AudioSystem::newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION); mHwSync = AudioSystem: ...

  4. .NETCore Nuget 发布包含静态文件 content file

    .NETCore 在.csproj引用资源中标记pack配置 <pack>true</pack>1例如 <ItemGroup> <Content Includ ...

  5. 算法金 | 详解过拟合和欠拟合!性感妩媚 VS 大杀四方

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今天我们来战 过拟合和欠拟合,特别是令江湖侠客闻风丧胆的 过拟合,简称过儿, Emmm ...

  6. openstack考试需要的部署操作

    openstack操作大全 一,keystone 用户 1.创建用户 openstack user create --password 密码 --email邮箱 --domain 域名 用户名字 2. ...

  7. SQL必知必会(第5版) 读书笔记

    适用范围 本书涵盖的DBMS一般来说,本书中所讲授的SQL可以应用到任何数据库管理系统(DBMS).但是,各种SQL实现不尽相同,本书介绍的SQL主要适用于以下系统(需要时会给出特殊说明和注释): ❑ ...

  8. python-一种去掉前后缀获取子串的方法

    假设有一个字符串,其数据组成方式为:"mode_id1_str_id2",其中id1和id2为任意个数的数字,若存在mode,则id1必然也存在,否则都不存在:id2可有可没有. ...

  9. python-判断两个序列的成员是否一样

    目的:判断两个序列的成员是否一样,如:list1 = [1, 2],list2 = [2, 1],则两个序列的成员是一样的. 实现:借助集合set()的性质实现. 代码如下: 1 if __name_ ...

  10. kettle从入门到精通 第六十五课 ETL之kettle 执行动态SQL语句,轻松实现全量&增量数据同步

    本次课程的逻辑是同步t1表数据到t2表,t1和t2表的表机构相同,都有id,name,createtime三个字段. CREATE TABLE `t1` ( `id` bigint NOT NULL ...