算法模板2:位运算+离散化+区间合并

文章目录

      • 1.6 位运算
      • **位运算的常见应用**
      • 1.7 离散化
        • **经典离散化题目例子**
          • **1. 区间合并和覆盖长度问题**
          • **2. 区间查询与修改**
          • **3. 动态求第 K 小值**
          • **4. 区间最大重叠次数**
          • **5. 动态逆序对计数**
          • **6. 二维区间问题**
          • **7. 模拟车流/时间段事件**
          • **8. 区间众数统计**
        • **具体例题**
      • 1.8 区间合并

1.6 位运算

位运算是直接在二进制位上进行操作的运算。位运算通常用于优化算法,尤其是当涉及到数字处理、快速计算和空间优化

  1. 按位与 & (AND)
  • 操作规则:当两个二进制数的对应位都为1时,结果才为1,否则为0。

    1010
    & 1101
    ------
    1000
    
    • 检查某一位是否为1: 例如,n & (1 << k) 判断第k位是否为1。如果为1,结果不为0;否则为0。
    • 清除最低位的1n & (n - 1) 会将n的最低位1变成0。
  1. 按位或 | (OR)
  • 操作规则:当两个二进制数的对应位中至少有一个为1时,结果为1。

    1010
    | 1101
    ------
    1111
    
    • 设置某一位为1n | (1 << k) 将第k位置为1。
  1. 按位异或 ^ (XOR)
  • 操作规则:当两个二进制数的对应位相异时,结果为1,否则为0。

    1010
    ^ 1101
    ------
    0111
    
    • 翻转某一位n ^ (1 << k) 将第k位的值翻转(1变成0,0变成1)。
    • 检查两个数是否相等a ^ b == 0 表示a与b相等。
  1. 按位非 ~ (NOT)
  • 操作规则:对每一位取反,1变成0,0变成1。

    ~ 1010
    ------
    0101
    
  1. 左移 << (Left Shift)
  • 操作规则:将二进制数的所有位向左移动指定的位数,左移时低位补0,高位丢弃。

    1010 << 1 = 10100
    
    • 乘以2n << 1 相当于将n乘以2。
    • 高速计算乘法:左移可以用来快速计算n的2的幂次方倍数。
  1. 右移 >> (Right Shift)
  • 操作规则:将二进制数的所有位向右移动指定的位数,右移时高位补符号位(有符号数时补1,没符号数时补0)。

    1010 >> 1 = 0101
    
    • 除以2n >> 1 相当于将n除以2。
    • 高速计算除法:右移可以用来快速计算n的2的幂次方除法。
  1. 获取某一位的值
n >> k & 1
  • 说明n >> k 将n右移k位,然后与1做按位与运算,这样可以获取n的第k位数字(0或1)。
  1. 获取n的最后一位1
lowbit(n) = n & -n
  • 说明n & -n 用来得到n的最后一位1。例如,n = 12 (1100) 时,lowbit(n) 的结果为 4 (0100)
    • -n 是n的二进制补码表示,n & -n 会保留n的最后一位1,并将其他所有位清零。

位运算的常见应用

  1. 判断奇偶性
    • 通过 n & 1 判断n是否为奇数(如果结果是1则n为奇数)。
  2. 快速计算2的幂
    • 使用 1 << k 来计算 2^k
  3. 检查二进制表示中是否只有一个1
    • n & (n - 1) == 0 可以检查n是否为2的幂(如果n只包含一个1)。
  4. 统计二进制中1的个数
    • __builtin_popcount(n)while (n) {n &= (n - 1);},每次去掉最右边的1。
  5. 交换两个数
    • a ^= b; b ^= a; a ^= b; 可以用异或交换两个数。
  6. 清除低位的1
    • n & (n - 1) 会把n的最低位的1清除。
  7. 模拟集合
    • 通过位运算可以模拟集合的操作,如 setunionintersection 等。例如,n 可以表示一个集合,其中第k位表示是否包含元素k。

1.7 离散化

核心作用:将数值范围较大的数据映射到一个较小的连续整数范围,便于在数组、前缀和、差分、树状数组、线段树等数据结构中操作。

主要解决值域大、数据稀疏的问题,结合其他算法实现高效求解,如扫描线、差分数组、树状数组和线段树等。

vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());   // 去掉重复元素// 二分求出x对应的离散化的值
int find(int x) // 找到第一个大于等于x的位置
{int l = 0, r = alls.size() - 1;while (l < r){int mid = l + r >> 1;if (alls[mid] >= x) r = mid;else l = mid + 1;}return r + 1; // 映射到1, 2, ...n
}
经典离散化题目例子
1. 区间合并和覆盖长度问题

题目:给定 n 个区间 [li,ri][l_i, r_i],求所有区间的覆盖总长度(去重后的长度)。

  • 分析:原区间可能范围很大(如 [1,109][1, 10^9]),无法直接操作。通过离散化,将所有区间端点压缩到较小范围。

  • 思路

    1. 离散化所有区间的端点。
    2. 用差分数组或扫描线记录区间变化,统计覆盖长度。
2. 区间查询与修改

题目:有 n 个点,每次给区间 [l,r][l, r] 增加一个值 cc,并查询某个点的最终值。

  • 分析:区间范围过大(如 1∼1091 \sim 10^9),通过离散化压缩到有限范围。

  • 思路

    1. 离散化所有可能的坐标。
    2. 使用差分数组、树状数组或线段树进行区间操作。
3. 动态求第 K 小值

题目:有 n 个操作,每次插入一个值或查询当前数据的第 k 小值。

  • 分析:可能有很大的值范围(如 [1,109][1, 10^9]),通过离散化解决大范围权值问题。

  • 思路

    1. 离散化所有插入的值。
    2. 用树状数组或线段树统计权值频次。
4. 区间最大重叠次数

题目:给定 n 个区间,求区间重叠最多的时间点及重叠次数。

  • 分析:时间点范围可能很大,需离散化区间端点。

  • 思路

    1. 离散化所有区间端点。
    2. 使用扫描线或差分数组统计每个离散点的重叠次数。
5. 动态逆序对计数

题目:给定一个初始数组,每次插入一个值,实时输出数组的逆序对个数。

  • 分析:插入值可能范围过大(如 [1,109][1, 10^9]),需离散化值域。

  • 思路

    1. 离散化所有可能的值。
    2. 用树状数组或线段树动态维护逆序对。
6. 二维区间问题

题目:给定 n 个矩形,求哪些矩形有重叠区域或总覆盖面积。

  • 分析:矩形坐标范围可能很大,需对 x 和 y 坐标分别离散化。

  • 思路

    1. 对 x 和 y 轴分别离散化,压缩到二维数组。
    2. 使用二维差分或扫描线处理。
7. 模拟车流/时间段事件

题目:给定 n 个车辆的进入和离开时间,求某时刻停车场中车辆的数量。

  • 分析:时间范围可能很大(如 [1,109][1, 10^9]),需离散化时间点。

  • 思路

    1. 离散化所有进入和离开的时间点。
    2. 使用差分数组统计每个时间点的车辆变化。
8. 区间众数统计

题目:给定一个数组,支持动态查询任意区间内的众数。

  • 分析:值域较大(如 [1,109][1, 10^9]),需离散化元素值。

  • 思路

    1. 离散化数组中的值。
    2. 用莫队算法或树状数组分块统计。
具体例题
  1. 区间统计问题:Leetcode 56 合并区间
  2. 动态第 k 小问题:Leetcode 315 计算右侧小于当前元素的个数
  3. 区间重叠次数:AcWing 1240 最大区间重叠
  4. 动态逆序对计数:Leetcode 493 翻转对
  5. 二维差分矩阵:AcWing 1226 最大矩形面积

1.8 区间合并

using PII = pair<int, int>;// 合并区间的函数
void merge(vector<PII> &segs) {vector<PII> res;// 1. 按起点排序,如果起点相同,按终点排序sort(segs.begin(), segs.end());// 2. 初始化st和ed为不可能出现的值int st = -2e9, ed = -2e9;// 3. 遍历所有区间for (auto seg : segs) {if (ed < seg.first) { // 当前区间与前一个区间不重叠if (st != -2e9) res.push_back({st, ed}); // 把上一个区间加入结果st = seg.first;  // 更新sted = seg.second; // 更新ed} else { // 当前区间与前一个区间重叠ed = max(ed, seg.second); // 合并区间,更新ed}}// 4. 最后一个区间加入结果if (st != -2e9) res.push_back({st, ed});egs = res; // 更新输入数组
}

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

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

相关文章

【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么?

博客主页&#xff1a; [青松] 本文专栏: NLP 大模型百面百过 【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方&#xff1f;为什么&#xff1f; 重要性&#xff1a;★★★ &#x1f4af; 本题主要考察面试者对以下问题的理解&#xff1a; ① 数据特征和模…

Python爬取豆瓣电影全部分类数据并存入数据库

在当今数字化的时代&#xff0c;网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天&#xff0c;我就来和大家分享一段有趣的代码&#xff0c;它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示&#xff08;文末附完整代码&#xff09;&#xff1a; 目…

YOLOv11(Ultralytics)视频选定区域目标统计计数及跟踪

在计算机视觉的众多应用场景中&#xff0c;对特定区域的目标进行检测、跟踪与计数是一个常见且重要的需求。无论是在智慧交通中统计通过特定路口的车辆数量&#xff0c;还是在零售分析中追踪进入特定区域的顾客行为&#xff0c;这一功能都发挥着不可或缺的作用。 随着深度学习…

数据结构与算法——1120——时间空间效率问题求边界值

目录 1、效率问题 1、时间复杂度 1、O(1) 2、O(n) 3、O(n) 或O(n*log2n)——n倍的log以2为底n的对数 例题 4、O(n) 2、空间复杂度 3、数组和链表 2、面试题之求边界值 题目 解答 &#xff08;1&#xff09;-i &#xff08;2&#xff09;~i &#xff08;3&#x…

第三十九篇 ShuffleNet V1、V2模型解析

摘要 ShuffleNet V1 ShuffleNet V1是由旷视科技&#xff08;Megvii&#xff0c;又称Face&#xff09;在2017年底提出的一种轻量级卷积神经网络架构。该网络专为移动设备和边缘计算环境设计&#xff0c;旨在以较低的计算资源实现高效的图像分类和其他计算机视觉任务。 特点与…

本地推流,服务器拉流全流程

本地推流&#xff0c;服务器拉流全流程 环境准备&#xff1a;准备一台服务器&#xff0c;其中openssl最好为1.1.1版本&#xff08;可以直接使用ubuntu20.04操作系统&#xff09; 服务器拉流 1、 安装环境依赖 sudo apt-get update sudo apt-get install unzip sudo apt-get…

基于Java Springboot海洋馆预约系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

产业用机器人中的旋转花键若损伤有何影响?

旋转花键在产业用机器人中是关键的组件之一&#xff0c;如果机器人中的旋转花键损坏&#xff0c;会对机器人的运行和性能产生一定影响。以下是可能的影响&#xff1a; 1、功能受限&#xff1a;旋转花键用于连接两个旋转部件&#xff08;例如电机轴和传动轴&#xff09;&#xf…

CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读

abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同&#xff0c;(Radford et al., 2021) 引入了一种新范式&#xff0c;该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中&#xff0c;通…

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻&#xff0c;今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”&#xff0c;百度文心智能体平台入选。 这个智能体平台我最近也有所关注&#xff0c;接下来我就来讲讲它。 百度在下一盘大棋…

RabbitMQ4:work模型

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

基于SpringBoot的数据结构系统设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

100.【C语言】数据结构之二叉树的堆实现(顺序结构) 1

目录 1.顺序结构 2.示意图 ​编辑 从物理结构还原为逻辑结构的方法 3.父子节点编号的规律 4.顺序存储的前提条件 5.堆的简介 堆的定义 堆的两个重要性质 小根堆和大根堆 6.堆的插入 7.堆的实现及操作堆的函数 堆的结构体定义 堆初始化函数HeapInit 堆插入元素函…

支持多种快充协议和支持多种功能的诱骗取电协议芯片

汇铭达XSP15是一款应用于手持电动工具、智能家居、显示器、音箱等充电方案的大功率快充协议芯片&#xff0c;支持最大功率100W给设备快速充电&#xff0c;大大缩短了充电时间。芯片支持通过UART串口发送电压/电流消息供其它芯片读取。支持自动识别连接的是电脑或是充电器。支持…

Three.js 相机控制器Controls

在 3D 场景中&#xff0c;摄像机的控制尤为重要&#xff0c;因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器&#xff0c;最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

CMake笔记:install(TARGETS target,...)无法安装的Debug/lib下

1. 问题描述 按如下CMake代码&#xff0c;无法将lib文件安装到Debug/lib或Release/lib目录下&#xff0c;始终安装在CMAKE_INSTALL_PREFIX/lib下。 install(TARGETS targetCONFIGURATIONS DebugLIBRARY DESTINATION Debug/lib) install(TARGETS targetCONFIGURATIONS Release…

docker安装使用Elasticsearch,解决启动后无法访问9200问题

1.docker安装、启动es docker pull elasticsearch:8.13.0docker images启动容器 docker run -d -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS"-Xms256m -Xmx256m" --name es01 8ebd258614f1-d 后台运行-p 9200:9200 -p 9300:9300 开放与主机映射端口-e ES_JAVA_OPTS…

java-排序算法汇总

排序算法&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09; 选择排序&#xff08;Selection Sort&#xff09; 插入排序&#xff08;Insertion Sort&#xff09; 快速排序&#xff08;Quick Sort&#xff09; 归并排序&#xff08;Merge Sort&#xff09; 堆排序&…

【笔记】自动驾驶预测与决策规划_Part7_数据驱动的预测方法

文章目录 0. 前言1. 多模态传感器的编码方式1.1 栅格化表示1.2 向量化表示 Vectornet1.3 基于点云或者多模态输入的预测1.4 基于Transformer的方法 2. 网络输出的表达形式2.1 多模态轨迹回归2.2 轨迹分类2.3 轨迹回归轨迹分类2.4 目标点预测 3.场景级别的预测和决策3.1 论文&am…

Tortoise ORM

官方文档&#xff1a;Tortoise ORM - Tortoise ORM v0.22.0 Documentation 简介 Tortoise ORM&#xff1a;异步&#xff0c;API和Django ORM 大多类似集成Pydantic&#xff1b;多用于asgi starlette / sanic / FastAPI...Sqlalchemy&#xff1a;支持异步&#xff0c;Flask / …