二分查找讲解

关于我为什么要写单独开一篇文章写二分,实际上那么多困难的算法,比如线段树,并查集等等都没有难倒我,我最近却被二分难倒了,而且是两次,两次在赛场上做不出来二分的应用题,于是我决定写一篇二分查找的算法总结.刚接触算法的时候本来是要写一篇的,但后面因为各种原因搁置了,现在来补一篇.我学的二分查找和传统的二分查找有一定的差别.传统的是将l和r都集中在一个点,这样非常不好处理边界.我学的二分查找会把l和r处理成相邻的两个元素.看下图.

一种是中间有相等元素的情况,一种的没有的情况,两个条件对于第一种会通向各自所属情况,这也很好理解,对于第一种,如果mid>=x,你把它赋值给r,那就说明r最后所属元素肯定时>=x,而l是<x,它们最终会出现在各自的边界.这个问题解决了,我们来看while循环里该填什么条件,实际上应该填l+1<r,最终如果l+1==r了就不再进行查找了,说明已经找到边界了.

那最初的边界l和r应该怎么定义呢,我们先考虑一种特殊情况,假如<x或>x不存在,l和r该指向哪,对于第一种l是不是指向第一个元素的左边呀,r指向第一个元素,应为没有mid能赋给l,既然l会出现在第一个元素的左边,那我们定义边界的时候是不是也要让它为第一个元素的左边?同理r要定义为最右边的元素的右边一个,宽泛来讲,l定义为要查找范围最左边元素的左边一个元素,r为要查找范围的最右边的元素的右边一个.

总结一下

1.while(),括号里填l+1<r.

2.查找第一个大于等于x的,使用if(a[mid]>=x)r=mid;else l=mid.反之见上面的图(懒).

3.边界定义:l定义为要查找范围最左边元素的左边一个元素,r为要查找范围的最右边的元素的右边一个.

对于基础练习,这边建议刷一下洛谷的二分题单,还是很简单的【算法1-6】二分查找与二分答案 - 题单 - 洛谷

下面我主要想讲一下卡了我的一道div3的E题题

Problem - E - Codeforces

没做出来真羞耻啊 

using i64 = long long;
using ll = long long;
i64 calc(int u, int x) {//x个跑道,相当于u,u-1,u-2...u-x+1,总共有x个,那不就是倒序相加公式嘛return 1LL * (u + u - x + 1) * x / 2;
}
void solve() {ll n;std::cin >> n;std::vector<ll>a(n), b(n + 1);
//维护前缀和for (int i = 0; i < n; i++) {std::cin >> a[i];b[i + 1] = b[i] + a[i];}ll q, l, u;std::cin >> q;std::vector<ll>bns;while (q--) {std::cin >> l >> u;u;//前面说的边界问题,找l到n,边界定义为l-1,n+1l--;ll k = l, j = n + 1;while (l + 1 < j) {ll mid = (l + j) / 2;if (b[mid] < b[k] + u)l = mid;else j = mid;}i64 ans = -1E18;int r = -1;//右边界小于等于nif (j <= n) {if (calc(u, b[j] - b[k]) > ans) {ans = calc(u, b[j] - b[k]);r = j;}}//j左边是l,l=j-1,k是l-1,l不能等于k-1,所以j-1>kif (j-1>k) {if (calc(u, b[j - 1] - b[k]) >= ans) {ans = calc(u, b[j - 1] - b[l]);r = j - 1;}}bns.push_back(r);}//其实你可以直接打印,没必要像我一样先存数组里.for (int i = 0; i < bns.size(); i++)std::cout << bns[i] << ' ';std::cout << '\n';
}
int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t;std::cin >> t;while (t--) {solve();}return 0;
}

实际上把边界处理好这道题还是很简单的,怪我太笨了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端-DOM树

dom树描述网页元素关系的一个专有名词&#xff0c;如html内包含了head、body&#xff0c;而head内包含meta、title、script等&#xff0c;body内包含div等元素&#xff1b;网页所有内容都在document里面&#xff0c;网页内容以树状形式排列&#xff0c;所以称之为dom树 dom树内…

WebCPM:首个开源的交互式网页搜索中文问答模型

论文题目&#xff1a;WEBCPM: Interactive Web Search for Chinese Long-form Question Answering   论文日期&#xff1a;2023/05/23(ACL 2023)   论文地址&#xff1a;https://arxiv.org/abs/2305.06849   GitHub地址&#xff1a;https://arxiv.org/abs/2305.06849 文章…

ChatGpt 使用fetch-event-source实现sse流式处理

microsoft/fetch-event-source 是一个由微软提供的库&#xff0c;用于在客户端和服务器之间建立基于 EventSource 的连接。EventSource 是一种 HTTP 协议&#xff0c;允许服务器向客户端推送实时事件流。该库提供了对 EventSource 协议的封装&#xff0c;使得在前端 JavaScript…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第1章 网络基础知识学习

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

RabbitMQ服务启动失败

报错信息&#xff1a; 在服务中启动RabbitMQ服务显示&#xff1a; RabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。 系统出错。 发生系统错误 1067。 进程意外终止 报错原因&#xff1a; 1.Erlang与RabbitMQ是否匹配 2.Erlang与RabbitMQ安装路径是否存在中文或空格 3.电…

Tomcat服务部署优化

目录 一.Tomcat的基本内容 1.概念 2.构成 &#xff08;1&#xff09;web容器 &#xff08;2&#xff09;servlet容器&#xff08;catalina&#xff09; &#xff08;3&#xff09;JSP容器 3.Tomcat顶层架构 &#xff08;1&#xff09;Tomcat中最顶层的容器是Server&…

type may not be empty [type-empty]

Git提交失败原因分析 原因是使用了规范commit信息的工具&#xff0c;你的提交信息不符合规范&#xff0c;所以被拒绝了 commit规范工具 commitlinthusky 我这个项目使用husky&#xff0c;提交规范比较严格。 解决方式一&#xff1a; 修改提交信息&#xff0c; 使其符合规范…

说一说kong日志级别

Kong官网&#xff1a;The Platform Powering the API World | Kong Inc. Kong Gateway&#xff1a;Kong Gateway | Kong Docs Kong Admin API&#xff1a;Admin API - Kong Gateway - v3.4.x | Kong Docs Kong 企业版社区&#xff1a;API Community for Developers and Industr…

vue js计时器

需求即是&#xff0c;点击了某人话机进行通讯&#xff0c;当获取通讯接口成功后开始计算通话时长。 代码如下

有效果的新闻软文推广都是怎么做的?

新闻软文推广能够在短时间内提高产品知名度&#xff0c;塑造品牌的美誉度与公信力&#xff0c;并且效果不是短期的&#xff0c;有一定的持续性&#xff0c;是数字化时代下品牌进行宣传的主要方式之一&#xff0c;受到很多企业的青睐&#xff0c;今天媒介盒子就来和大家聊聊&…

外汇天眼:Sumsub推出播客,讨论最新的欺诈威胁

Sumsub&#xff0c;一家全球验证平台&#xff0c;今天宣布推出自己的播客&#xff0c;名为《什么是欺诈&#xff1f;》。节目将邀请来自各行各业的专业嘉宾&#xff0c;包括人工智能、网络安全、金融科技、加密货币和互联网游戏等领域的专家。对话将集中讨论数字欺诈如何影响企…

C/C++ 迷宫游戏

游戏介绍 这个迷宫探险游戏有以下功能&#xff1a; 探险&#xff1a;选择该选项后&#xff0c;玩家会进入地下迷宫进行探险。在随机事件中&#xff0c;可能会遇到陷阱、发现金币或者什么都没有发生。陷阱会使玩家失去一定的生命值&#xff0c;金币可以增加玩家的金币数量。 休…

浅谈XSS简单漏洞xss-labs-master(初级)

一、环境以及xss漏洞简介 网上很多gethub自己下就行 XSS简介&#xff1a; 当用户访问被XSS注入的网页&#xff0c;XSS代码就会被提取出来。用户浏览器就会解析这段XSS代码&#xff0c;也就是说用户被攻击了。 用户最简单的动作就是使用浏览器上网&#xff0c;并且浏览器中有J…

git忽略某些文件(夹)更改说明

概述 在项目中,常有需要忽略的文件、文件夹提交到代码仓库中,在此做个笔录。 一、在项目根目录内新建文本文件,并重命名为.gitignore,该文件语法如下 # 以#开始的行,被视为注释. # 忽略掉所有文件名是 a.txt的文件. a.txt # 忽略所有生成的 java文件, *.java # a.j…

力扣-H指数

问题 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#xff09…

Qt 简约美观的加载动画 小沙漏风格 第六季

这次和大家分享一个沙漏风格的加载动画 效果如下: 这是本系列的第六季了, 本次内容的关键在于cubicTo函数的使用, 在这里分享一个非常好用的网站https://www.desmos.com/calculator/cahqdxeshd 在这上面可以手动拖动贝塞尔曲线的控制点, 并且显示了起终点和两个控制点的精确坐…

Linux中如何在创建子线程的时候设置为分离属性

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<unistd.h> #include <pthread.h> void *mythread(void *arg) {printf("id[%ld]\n",pthread_self()); } int main() { //定义pthread_…

ulimit命令

ulimit命令 ulimit 命令用于查看和设置 shell 运行时的资源限制。它可以控制各种资源&#xff0c;如文件打开数量、堆栈大小、CPU 时间等。ulimit 命令通常用于限制 shell 启动的进程的资源使用量&#xff0c;以防止系统资源被耗尽。ulimit命令的主要作用是提高系统的性能和稳…

智能水表预付费管理系统

智能水表预付费管理系统是当前智能水表技术的重要应用之一&#xff0c;结合了智能化管理和预付费功能&#xff0c;为水务公司和用户提供了便捷、高效的用水管理解决方案。该系统利用先进的科技手段&#xff0c;实现了水表抄表、计费和管理的自动化&#xff0c;为用户带来更便捷…

【粉丝福利第一期】小 明

Q1 - 能否自我介绍下&#xff1f; 嗨&#xff0c;大家好&#xff0c;我是 小 明 &#xff08;小明java问道之路&#xff09;&#xff0c;互联网大厂后端研发专家&#xff0c;2022博客之星TOP3/博客专家/CSDN后端内容合伙人、InfoQ(极客时间)签约作者、阿里云签约博主、全网5万…