倍增node

article/2025/9/29 15:30:06

倍增

普及组的内容,思想很简单,但是考的可以挺难

倍增是啥东西

倍增,顾名思义,就是每次增加一倍。 展开来说,就是每次根据已经得到的信息,将考虑的范围增加一倍, 从而加速操作。倍增思想有什么用呢?这是一种非常巧妙的思想,可以用来解决信息学竞赛中的很多问题。
考虑这样一个比较一般的模型,在一个有向图中,每个点最多只有 一条出边,每条边有一定的信息,走过一条路径时,就将路径上边的信息依次按一定的规则合并,并且合并的规则满足结合律。

普通的线性倍增

问题:给定数组 a a a和数字 T T T,求最大的位置 k k k,满足 s u m ( 1 − > k ) < = T sum(1 -> k)<=T sum(1>k)<=T
那么我们就可以有2种做法:

  1. 前缀和 + 二分
    这种代码应该挺简单
    如果不会前缀和的建议看一下前缀和和差分
#include <stdio.h>
#include <string.h>#include <iostream>const int MAXN = 5555555; 
int a[MAXN], pre[MAXN];
int n, k, t;inline void sum() {for (int i = 1; i <= n; ++i) {pre[i] = pre[i - 1] + a[i];}
}inline int bs(int l, int r) {int mid = l + r >> 1;if (pre[mid] > t) {if (pre[mid - 1] <= t) return mid  - 1;else return bs(l, mid);} else if (pre[mid] == t) return mid;else return bs(mid + 1, r);
}int main() {scanf("%d%d", &n, &t);for (int i = 1; i <= n; ++i) {scanf("%d", &a[i]);}sum();printf("%d\n", bs(1, n));return 0;
}

这里放一段代码(如果有bug请指出) -

2.二分 + 倍增
画个图,大概是这样的:
在这里插入图片描述
二分不会的话,去看看这个 二分

树上倍增

树上倍增最经典的数LCA(最先公共祖先)了, 上次讲LCA模板搞出来了很多槽点

在图论和计算机科学中,最近公共祖先(英語:lowest common ancestor)是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点。在这里,我们定义一个节点也是其自己的后代,因此如果v是w的后代,那么w就是v和w的最近公共祖先。
最近公共祖先是两个节点所有公共祖先中离根节点最远的,计算最近公共祖先和根节点的长度往往是有用的。比如为了计算树中两个节点v和w之间的距离,可以使用以下方法:分别计算由v到根节点和w到根节点的距离,两者之和减去最近公共祖先到根节点的距离的两倍即可得到v到w的距离。

LCA模板:

inline void dfs(int index, int father) {  // index表示当前节点,father表示它的父亲节点fa[index][0] = father;//记录粑粑是哪一位depth[index] = depth[father] + 1;//深度自然就是他爸+1for (int i = 1; i <= lg[depth[index]]; ++i) fa[index][i] = fa[fa[index][i - 1]][i - 1];//第$2^i$个祖先是第$2^(i - 1)$个祖先的$2^(i - 1)$个祖先for (int i = head[index]; i; i = e[i].nxt)//遍历if (e[i].t != father) {//如果现在访问这个节点是自己的儿子(千万别把爸爸当做儿子了)dfs(e[i].t, index);//dfs}
}inline int LCA(int x, int y) {if (depth[x] < depth[y]) swap(x, y); // x喜欢在下面,看着y不顺眼就把y拉上去了(如果自己跳到y下面就会S)while (depth[x] > depth[y]) x = fa[x][lg[depth[x] - depth[y]] - 1]; //不过规定要一起去找LCA, 要同时跳到同一层()if (x == y) return x;//如果已经碰到一起了,LCA就是他们碰到的地方for (int k = lg[depth[x]] - 1; k >= 0; --k) //一起往上跳if (fa[x][k] != fa[y][k]) x = fa[x][k], y = fa[y][k];//得保证同时跳到的层析不是他们的LCAreturn fa[x][0]; //return theirs father(LCA)
}

RMQ & ST

RMQ和ST都有一个明显的特征:要预处理
那么什么时候要用到?
你看一下有m次或者q次询问的时候你就可以去想一下,很有可能这个就是RMQ & ST, 如果他的n数据范围很大、m(这个有可能是q、t等等)的数据范围也很大,并且 O ( n l o g 2 n ) ≤ 1 0 8 × m s ÷ 1 0 3 O(n\ log_2n) \leq 10^8 \times ms\div 10^3 O(n log2n)108×ms÷103 简单来说就是不会超时(如果 n ≤ 10000 , m ≤ 10000 n \leq 10000, m \leq 10000 n10000m10000的话我觉得你可以试试看 O ( m × n ) O(m\times n) O(m×n))
关于代码吗, 这里写一小段 -> 因为没有注释,思路很明显 这是模板题的AC代码(请勿he题解)

#include <bits/stdc++.h>
using namespace std;
int f[100001][40], a, x, LC, n, m, p, len, l, r, lg[100001];signed main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &a);f[i][0] = a;lg[i] = lg[i >> 1] + 1;}LC = lg[n] / lg[2];for (int j = 1; j <= LC; j++) {for (int i = 1; i <= n - (1 << j) + 1; i++)  f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);}for (int i = 1; i <= m; i++) {scanf("%d%d", &l, &r);p = lg[r - l + 1] / lg[2];printf("%d\n", max(f[l][p], f[r - (1 << p) + 1][p]));}return 0;
}

倍增的思路还是挺经典的

end

http://chatgpt.dhexx.cn/article/kBjR1SYV.shtml

相关文章

倍增求LCA

一&#xff1a;定义 LCA指的是最近公共祖先。具体地&#xff0c;给定一棵有根数&#xff0c;若结点z既是结点x的祖先&#xff0c;也是结点y的祖先&#xff0c;则称z是x&#xff0c;y的公共祖先。在x&#xff0c;y的公共祖先中&#xff0c;深度最大的那个节点成为x&#xff0c;y…

倍增数组基础

应用&#xff1a; 给定一个数列a, 基本的倍增数组可以用O(1)的时间复杂度计算出区间[i,j]的最值。 具体操作&#xff1a; 维护倍增数组 1、状态 dp[j][i]表示区间从i到 i(2^j)-1,即以i开始长度为2^j 这个区间范围的最值。&#xff08;下面以最小值为例&#xff09; 2、状态转移…

倍增LCA

朴素算法求LCA&#xff0c;即暴力求解&#xff0c;当树近乎为一条链时&#xff0c;找祖先时一级一级向上跳&#xff0c;时间复杂度接近O(n),所以可以考虑一次跳尽可能大的距离&#xff0c;即倍增算法&#xff1b;一次跳2^i&#xff08;i0,1,2....&#xff09;级。 倍增法 一个节…

倍增算法

倍增算法 【序言】 我认为吧,所有能够优化复杂度的算法都是神奇的,所有能够化繁琐为形象的文字都是伟大的。一直觉得倍增算法是个很神奇的东西,所以决定写点东西纪念一下它。但是作为一个非常不称职的OIER,我非常讨厌在看别人的算法解析时整版的i,j,k等我看到鼠标…

浅谈倍增及应用

浅谈倍增 倍增思想 原理&#xff1a; 倍增&#xff0c;即成倍增长。在处理一系列序列数据时&#xff0c;倍增可通过指数级的增长快速覆盖所有数据。 倍增算法采用2倍增长的方式&#xff0c;其核心思想是建立以下数组T a[i][j] &#xff0c;表示自i向后共 2 j 2^j 2j个数据的…

倍增(ST表与LCA)

倍增&#xff08;ST表与LCA&#xff09; 什么是倍增&#xff1f; 倍增&#xff0c;就是成倍增长。指我们进行递推时&#xff0c;如果状态空间很大&#xff0c;通常线性递推无法满足时空复杂度要求&#xff0c;那么可以通过成倍增长的方式&#xff0c;只递推状态空间中 2 的整…

V4L2-框架

1.概述 V4L2 是专门为linux 设备设计的一套视频框架&#xff0c;其主体框架在linux内核&#xff0c;可以理解为是整个linux系统上面的视频源捕获驱动框架。 相机驱动层位于HAL Moudle 与硬件层之间&#xff0c;借助linux 内核驱动框架&#xff0c;以文件节点的方式暴露接口给用…

V4L2学习笔记

首先附上&#xff0c;Linux内核网站&#xff1a; 入口 v4l2非常棒的一篇文章 入口 内核代码查看&#xff1a; 入口 一个博客文档&#xff1a; 入口 https://lwn.net/Articles/204545/ 别人整理 关于linux内核头函数&#xff1a; /usr/src/xxx 系列文 在其内部有media文件…

V4L2框架学习

V4L2框架 0 查看videodev2 0.1 头文件/usr/include/linux/videodev2.h 0.2 使用ioctl函数 使用ioctl函数 // 添加头文件 #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h>int ioctl (int __fd, unsigned long int __request, ...…

V4L2介绍

V4L2介绍 V4L2介绍主要功能框架v4L2编程 V4L2介绍 V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中&#xff0c;视频设备是设备文件&#xff0c;可以像访问普通文件一样对其进行读写&#xff0c;摄像头在/dev/video*下&#xff0c;如果只有一个视频…

linux V4L2子系统——v4l2架构(7)之V4L2应用编程

linux V4L2子系统——v4l2架构&#xff08;7&#xff09;之V4L2应用编程 备注&#xff1a;   1. Kernel版本&#xff1a;5.4   2. 使用工具&#xff1a;Source Insight 4.0   3. 参考博客&#xff1a; &#xff08;1&#xff09;Linux V4L2子系统-应用层访问video设备&a…

[2022.8.15]v4l2-ctl基本使用方法

v4l2-ctl使用帮助可以参考&#xff1a;https://www.mankier.com/1/v4l2-ctl 1 v4l2-ctl --list-devices 列出所有设备 USB 2.0 Camera: USB Camera (usb-0000:00:14.0-9):/dev/video0/dev/video1 一个USB camera对应两个设备&#xff1a;一个是图像/视频采集&#xff0c;一…

V4L2应用层分析

V4L2应用层分析 一、总述二、例子 一、总述 V4L2&#xff0c;即Video for Linux 2&#xff0c;是第二代为Linux打造的音频、视频驱动。相比第一代V4L&#xff0c;V4L2支持更多的设备&#xff0c;同时更加稳定。现今的视频设备&#xff0c;如USB摄像头&#xff0c;基本都支持V4…

v4l2数据结构分析

v4l2数据结构分析 文章目录 v4l2数据结构分析Video4Linux2设备v4l2_device媒体设备media_deviceVideo4Linux2子设备v4l2_subdevVideo4Linux2子设备的操作集v4l2_subdev_opsVideo4Linux2子设备的内部操作集v4l2_subdev_internal_opsVideo4Linux2控制处理器v4l2_ctrl_handlerVide…

摄像头V4L2编程应用开发

1.V4L2简介 Video for Linux two(Video4Linux2)简称V4L2&#xff0c;是V4L的改进版。V4L2是linux系统操作系统下一套用于采集图片、视频、和音视频数据的通用API接口&#xff0c;配合适当的视频采集设备和相应的驱动程序&#xff0c;可以实现图片、视频、音频等的采集。 在linu…

V4L2框架

前言 在分析v4l2之前最好具有的知识&#xff1a; 1.字符设备,因为v4l2是被枚举为字符设备。 2.内存分配和映射,比如相关数据结构的分配和buffer。 3.DMA&#xff0c;因为v4l2的数据传输用到了DMA。 4.I2C&#xff0c;因为很多传感器都是用的i2c接口。 5.文件系统的基本操作&am…

V4L2系列 之 V4L2驱动框架

目录 前言一、V4L2驱动框架概览1、应用层 -》中间层-》驱动层2、主要代码文件(Linux 4.19版本内核) 二、怎么写V4L2驱动1、如何写一个设备的驱动&#xff1f;2、Video设备主要结构体3、怎么写V4L2驱动 三、V4L2的调试工具1、v4l2-ctl2、dev_debug3、v4l2-compliance 前言 本篇文…

V4L2框架概述

原文链接 本文开启 linux 内核 V4L2 框架部分的学习之旅&#xff0c;本文仅先对 V4L2 的框架做一个综述性的概括介绍&#xff0c;然后接下来的文章中会对 V4L2 框架的各个子模块进行一个全面的介绍&#xff0c;包括每一部分的实现原理&#xff0c;如何使用&#xff0c;用在什么…

V4l2框架分析

Table of Contents 1.V4L2框架概述 1.1 v4l2设备应用层流程 1.2 内核V4L2模块 1.2.1 video_device 1.2.2 v4l2_subdev 1.2.3 videobuf2 2. video_device结构体 2.1 图像处理模块 2.2 video_device处理流程 2.2.1 video_device 结构体成员介绍: 3. video_buf2 3.1 …