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

算法模板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; // 更新输入数组
}

相关文章:

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

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

钉钉授权登录

一.找开钉钉开发平台【钉钉开放平台 (dingtalk.com)】 二。点击菜单【应用开发】->左边【钉钉应用】->【创建应用】 三。创建应用-》保存成功后&#xff0c;点击自己【新建的应用】&#xff0c;进入详细页面 四。进入应用详细页面。左边【分享设置】 注意&#xff1a;进…...

【视频】二维码识别:libzbar-dev、zbar-tools(zbarimg )

1、简介 ZBar可以使用多个方式识别各种条形码和二维码。 支持的格式有:EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 93、Code 39、Codabar、Interleaved 2 of 5、QR Code和SQ Code 支持的来源有:视频流、图像文件等 libzbar-dev:二维码识别开发库 zbar-tools(zbarimg …...

C语言中的结构体,指针,联合体的使用

目录 1. 概述2. 定义和初始化3. 成员的使用4. 结构体数组5. 结构体套结构体6. 结构体赋值7. 结构体和指针8. 结构体作为函数参数9. 共用体&#xff08;联合体&#xff09;10. typedef就是取别名总结 1. 概述 数组&#xff1a;连续的相同数据类型的集合 结构体&#xff1a;不同…...

基于卡尔曼滤波器的 PID 控制

基于卡尔曼滤波器的PID控制算法结合了经典控制理论和现代信号处理技术。卡尔曼滤波器&#xff08;Kalman Filter, KF&#xff09;可以对噪声数据进行平滑处理&#xff0c;从而改善PID控制器的性能&#xff0c;特别是在处理具有噪声和不确定性的系统时。以下是详细的设计过程&am…...

CVE-2022-26201

打开是这么个页面 左上角找到Admin访问 里面有个Add Users&#xff0c;访问一下&#xff0c;能创建用户&#xff0c;有个能上传图片的地方 普通的一句话木马无法访问flag&#xff0c;需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…...

海信Java后端开发面试题及参考答案

TCP 的优点是什么? TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它具有众多优点。 首先,TCP 提供可靠的传输服务。它通过序列号、确认应答、重传机制等确保数据的准确无误传输。例如,在发送数据时,发送方会…...

传智杯 3-初赛:终端

题目描述&#xff1a; 有一天您厌烦了电脑上又丑又没用的终端&#xff0c;打算自己实现一个 Terminal。具体来说&#xff0c;它需要支持如下命令: 1. touch filename&#xff1a;如果名为 filename 的文件不存在&#xff0c;就创建一个这样的文件&#xff0c;如果已经存在同名…...

大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【中间件】Redis

一、什么是Redis Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合&#xff0c;位图&#xff0c;hyperloglogs等数据类型。内置…...

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展&#xff0c;流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言&#xff0c;把握这些趋势并积极应对挑战将是实现成功的关键…...

Java爬虫:获取商品详情的实践之旅

在当今这个信息爆炸的时代&#xff0c;数据的价值日益凸显。对于电商行业来说&#xff0c;商品详情的获取尤为重要&#xff0c;它不仅关系到产品的销售&#xff0c;还直接影响到用户体验。传统的人工获取方式耗时耗力&#xff0c;而自动化的爬虫技术则提供了一种高效解决方案。…...

行业分析---2024年小鹏汽车AI Day及三季度财报

1 背景 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…...

写时复制,读时加载

实现写时复制&#xff0c;读时加载&#xff0c;原理为&#xff0c;申请内存时&#xff0c;只给一段线性地址空间&#xff0c;并不分配物理内存&#xff0c;当cpu读、写该内存时&#xff0c;发生缺页中&#xff0c;或者写错误&#xff0c;中断处理程序根据前面设置的内容&#x…...

Python和R基因组及蛋白质组学和代谢组学

&#x1f335;Python片段 1. 数据处理与清理 基因组病理学的数据通常非常庞大&#xff0c;且可能包括 DNA 或 RNA 测序结果、基因表达数据等。Python 提供了高效的数据处理工具。 工具和库 Pandas: 用于加载、清理和操作数据。Numpy: 用于高效的数值计算。Dask: 用于大规模数…...

selenium环境搭建详细过程

一、准备工作 在开始搭建 Selenium 环境之前&#xff0c;确保具备以下条件&#xff1a; 1.稳定的网络连接&#xff1a; 以便能够下载所需的软件和驱动程序。 2.操作系统基础&#xff1a; 对您的操作系统&#xff08;如 Windows、Mac 或 Linux&#xff09;有基本的了解和操…...

Linux知识 - VIM

VI于VIM linux系统里边内置了一个编辑器就叫做vi&#xff08;visual editor&#xff09;&#xff0c;但vi的功能非常有限&#xff0c;所以一般Linux的使用人员会选择一个比vi更强大的编辑器vim Vim的三种工作模式 输入模式 在正常模式中按下别字母键&#xff0c;会进入插入模式…...

【数据结构】链表重难点突破

目录 一、链表的概念 二、链表的实现 2.1 链表的构建 2.2 从链表头部添加元素 2.3 从链表尾部添加元素 2.4 链表任意位置添加元素 2.5 常规方法实现 2.6 获取指定位置的元素 2.7 获取指定元素的位置 2.8 修改链表中某一节点 2.9 删除链表的头结点 2.10 删除链表的尾…...

大宗商品行业区块链应用

应用场景 区块链技术具有透明性、去中心化、不可篡改等特点&#xff0c;因此可以在大宗商品定价方面得到应用。通过区块链技术&#xff0c;相关交易的各方可以在无需依赖中心化第三方的情况下&#xff0c;实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...

Varjo:垂直起降机混合现实培训解决方案

混合电动垂直起降机&#xff08;VTOL&#xff09;作为一种新型的航空运输机具有超越传统汽车的安全性、与飞机相当的速度以及无与伦比的灵活起降功能。电动垂直起降机能够在建筑顶部、直升机场或是没有跑道的地区起飞或降落&#xff0c;且排放要远远低于由航空汽油驱动的传统飞…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

以太网PHY布局布线指南

1. 简介 对于以太网布局布线遵循以下准则很重要&#xff0c;因为这将有助于减少信号发射&#xff0c;最大程度地减少噪声&#xff0c;确保器件作用&#xff0c;最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确&#xff0c;然…...

MeanFlow:何凯明新作,单步去噪图像生成新SOTA

1.简介 这篇文章介绍了一种名为MeanFlow的新型生成模型框架&#xff0c;旨在通过单步生成过程高效地将先验分布转换为数据分布。文章的核心创新在于引入了平均速度的概念&#xff0c;这一概念的引入使得模型能够通过单次函数评估完成从先验分布到数据分布的转换&#xff0c;显…...

迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命

一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中&#xff0c;每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战&#xff1a; 效率瓶颈&#xff1a;工人每小时仅能处理200-300件&#xff0c;且存在间歇性疲劳安全隐患&#xff1a;20kg以上重箱搬运导致年…...

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起&#xff1a; 1、根据RK809的DATASHEET&#xff0c;短按开机【100ms/500ms】/长按关机&#xff0c;长按关机。6s/8s/10s 我在网上找到的DATASHE…...

词法分析和词性标注 自然语言处理

目录 一. 概述 1 不同语言的词法分析 2 英语的形态分析 英语单词的形态还原&#xff08;和正常英语的词法变化一样&#xff09; 1.有规律变化单词的形态还原 ​编辑 2.动词&#xff64;名词&#xff64;形容词&#xff64;副词不规则变化单词的形态还原 3.对于表示年代&…...

鼠标的拖动效果

1、变量的设置 let isDragging false; let startX; let startY&#xff1b; let endX; let endY; let box null;isDragging : 表示是否推拽startX、startY&#xff1a;表示起始坐标&#xff0c;相对于元素endX、endY&#xff1a;表示结束坐标&#xff0c;相对于元素box&…...