当前位置: 首页 > news >正文

A-B数对(二分查找)

 

#include<bits/stdc++.h>
using namespace std;using ll = long long;int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n,c;cin>>n>>c;int nu[200000];for(int i=0;i<n;i++){cin>>nu[i]; // 输入数组元素}sort(nu,nu+n);ll cnt=0; // 统计满足条件的数对数量for(int i=0;i<n;i++){ll a=nu[i]+c;int l=0,r=n-1;ll ans=n; // 初始设为数组长度(表示未找到)while(l<=r){int mid=l+(r-l)/2;if(nu[mid]>=a){ans=mid;r=mid-1;}else{l=mid+1;}}l=0,r=n-1;ll res=-1; // 初始设为 -1(表示未找到)while(l<=r){int mid=l+(r-l)/2;if(nu[mid]>a){r=mid-1;} else{res=mid;l=mid+1;}}if(ans<=res){cnt+=res-ans+1;}}cout<<cnt;return 0;}

输入数组 nu 并对其排序,方便后续通过二分查找快速定位数值。

遍历数组中的每个元素 nu[i],计算目标值 a = nu[i] + c,即寻找数组中大于或等于 a 的第一个位置(起始点)和小于或等于 a 的最后一个位置(结束点)。

两次二分查找

  • 第一次二分查找:找到数组中第一个大于等于 a 的位置。
  • 第二次二分查找:找到数组中最后一个小于等于 a 的位置。
  • 两次查找的结果分别是 ansres

数对的数量为区间长度 res - ans + 1

使用 lower_boundupper_bound:

#include<bits/stdc++.h>
using namespace std;using ll = long long;int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n,c;cin>>n>>c;int nu[200000];for(int i=0;i<n;i++){cin>>nu[i];}sort(nu,nu+n);ll cnt=0;for(int i=0;i<n;i++){ll a=nu[i]+c;ll ans=lower_bound(nu,nu+n,a)-nu;ll res=upper_bound(nu,nu+n,a)-nu-1;if(ans<=res){cnt+=res-ans+1;}}cout<<cnt;return 0;}

lower_bound(nu, nu + n, a) 返回的是第一个大于或等于 a 的元素的迭代器。

upper_bound(nu, nu + n, a) 返回的是第一个大于 a 的元素的迭代器。由于我们需要找的是小于或等于 a 的最大值,因此在计算 res 时,需要减去 1。

  • ans 是第一个大于等于 a 的位置,使用 lower_bound 获取。
  • res 是最后一个小于等于 a 的位置,使用 upper_bound 获取,然后减去 1。
http://www.lryc.cn/news/488950.html

相关文章:

  • Vue 的各个生命周期
  • 实现简易计算器 网格布局 QT环境 纯代码C++实现
  • 后端开发详细学习框架与路线
  • 2.langchain中的prompt模板 (FewShotPromptTemplate)
  • FairGuard游戏加固实机演示
  • Spark使用过程中的 15 个常见问题、详细解决方案
  • 算法【最长递增子序列问题与扩展】
  • k8s篇之flannel网络模型详解
  • windows 和 linux检查操作系统基本信息
  • Oracle OCP认证考试考点详解082系列22
  • 线性回归 - 最小二乘法
  • Linux - 线程基础
  • 网络爬虫——分布式爬虫架构
  • RT_Thread内核源码分析(三)——线程
  • 正排索引和倒排索引
  • 丹摩 | 重返丹摩(上)
  • Frontend - 防止多次请求,避免重复请求
  • RHCE的学习(22)
  • 【前端知识】简单讲讲什么是微前端
  • AWS IAM
  • 丹摩|丹摩助力selenium实现大麦网抢票
  • 基于Qt/C++/Opencv实现的一个视频中二维码解析软件
  • 智慧理财项目测试文档
  • R | 统一栅格数据的坐标系、分辨率和行列号
  • C++学习——编译的过程
  • 当你要改文件 但是原来的文件内容又不能丢失的时候,拷贝一份(备注原来的),然后添加后缀:.bak
  • MATLAB神经网络(五)——R-CNN视觉检测
  • mock.js:定义、应用场景、安装、配置、使用
  • 【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
  • Transformer中的Self-Attention机制如何自然地适应于目标检测任务