Day 1 - 二分
整数二分
我们可以做到每次排除一半的答案,时间复杂度 \(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\) 次。
实际应用
实现求解连续函数的零点(近似解)。
\(0/1\) 分数规划。
最小比值生成树。
三分法
三分法衍生自二分法,三分法求单峰函数的峰值。
算法流程
设当前搜索域为 \([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 - 二分的更多相关文章
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- 整体二分QAQ
POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...
- [bzoj2653][middle] (二分 + 主席树)
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...
- [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 ...
- [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 ...
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
- 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 ...
随机推荐
- Istio(七):ServiceEntry,sidecar,Envoy Filter
目录 一.模块概览 二.系统环境 三.ServiceEntry 四.sidecar 4.1 Sidecar 4.2 工作负载选择器 4.3 入口和出口监听器 五.Envoy Filter 5.1 En ...
- swagger 的配置
1,开启swagger : c.IncludeXmlComments(GetXmlCommentsPath()); protected static string GetXmlCommentsPath ...
- uniapp 配置 基座调试指定页面
在用hbuildx时,用自定义基座,调试程序时,有的页面因为基座缺少组件而进不去,这个时候就可以用指定页面的方式,我们只需要把进入页面的入参传进去,这个时候打开页面就是指定要调试的页面了. 就在pag ...
- springboot~封装依赖引用包jar还是pom,哪种更规范
将多个第三方包封装成一个项目后,如果你的目的是让其他开发人员可以直接引用这些依赖,一般来说有两种常见的方式: 打成JAR包:将封装好的项目编译打包成JAR文件,其他开发人员可以将这个JAR文件添加到他 ...
- 一个 .NET 开源的地图组件库 - Mapsui
前言 今天大姚给大家分享一个.NET开源(MIT License).免费.同时支持多平台框架(MAUI.WPF.Avalonia.Uno.Blazor.WinUI.Eto..NET Android 和 ...
- nginx启动流程
nginx启动流程 1. 根据命令行决定配置文件路径 2. 如果处于升级中则监听环境变量里传递的监听句柄 3. 调用所有核心模块的create_conf方法生成存放配置项的结构体 4. 针对所有核心模 ...
- uniapp 添加操作
1 分析: 2 需要动态的向数据库中插入数据,既然要进行添加操作,就会触发一个点击的事件,所以我们的第一步就是要先绑定事件 3 向服务器进行请求接口操作,请求的方法为 'POST' 4 最后就是在me ...
- Android应用程序启动流程浅析-(三万字长文慎点&Android14)
在Android桌面Launcher源码浅析中介绍了Android的桌面程序Launcher是如何响应用户点击事件并启动App的,这篇文章继续介绍App在Android系统层是的启动流程. 一.启动流 ...
- WPS WORD EXCEL 不合并显示
WPS WORD EXCEL 不合并显示 版本:WPS 12 , 下载时间约是2023 年. 1.在开始菜单里找到 WPS OFFICE - 配置工具 2.点击"高级(A)". 3 ...
- 蓝屏rtux64w10.sys
蓝屏rtux64w10.sys 环境: WIN10 + Realtek USB RTL8156B 2.5G网卡 表现: 局域网复制时,间隔性速度变为0,多次后,最终蓝屏. 解决方法: 更新驱动. 地 ...