首页 > 其他分享 >倍增(LCA与ST表)附详细讲解博客路劲以及洛谷模板题

倍增(LCA与ST表)附详细讲解博客路劲以及洛谷模板题

时间:2024-04-06 15:59:30浏览次数:14  
标签:洛谷 int ST fa 算法 LCA include com

前置知识 -- 倍增

倍增算法,顾名思义,就是不断地翻倍。

虽然是一种基础算法,但它能够使得线性的处理转化为对数级的处理,大大地优化时间复杂度,在很多算法中都有应用,其中最常见的就是ST表以及LCA(树上最近公共祖先)了。

学习博客:算法学习笔记(12): ST表 - 知乎 (zhihu.com)

for(int x=1;x<=n;x++) to[x][0]=(x+k)%n+1,carrot[x][0]=num[x];
for(int i=1;i<=64;i++)
    for(int x=1;x<=n;x++)
    {
        to[x][i]=to[to[x][i-1]][i-1];
        carrot[x][i]=carrot[x][i-1]+carrot[to[x][i-1]][i-1];
    }
int p=0,now=1,ans=0;
while(m)
{//若m的二进制第p-1位为1,则答案加上去
    if(m&(1<<p)) ans+=carrot[now][p],now=to[now][p];
    m^=(1<<p);//第p-1位清空
    p++;
}

LCA 树上最近公共祖先

学习博客:算法详解之最近公共祖先(LCA) - hulean - 博客园 (cnblogs.com)

代码模板

// https://www.luogu.com.cn/problem/P3379
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct zzz {
    int t, nex;
}e[500010 << 1]; int head[500010], tot;
void add(int x, int y) {
    e[++tot].t = y;
    e[tot].nex = head[x];
    head[x] = tot;
}
int depth[500001], fa[500001][22], lg[500001];
void dfs(int now, int fath) {
    fa[now][0] = fath; depth[now] = depth[fath] + 1;
    for(int i = 1; i <= lg[depth[now]]; ++i)
        fa[now][i] = fa[fa[now][i-1]][i-1];
    for(int i = head[now]; i; i = e[i].nex)
        if(e[i].t != fath) dfs(e[i].t, now);
}
int LCA(int x, int y) {
    if(depth[x] < depth[y]) swap(x, y);
    while(depth[x] > depth[y])
        x = fa[x][lg[depth[x]-depth[y]] - 1];
    if(x == y) return x;
    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];
    return fa[x][0];
}
int main() {
    int n, m, s; scanf("%d%d%d", &n, &m, &s);
    for(int i = 1; i <= n-1; ++i) {
        int x, y; scanf("%d%d", &x, &y);
        add(x, y); add(y, x);
    }
    for(int i = 1; i <= n; ++i)
        lg[i] = lg[i-1] + (1 << lg[i-1] == i);
    dfs(s, 0);
    for(int i = 1; i <= m; ++i) {
        int x, y; scanf("%d%d",&x, &y);
        printf("%d\n", LCA(x, y));
    }
    return 0;
}

ST表 区间最值

学习博客:算法学习笔记(12): ST表 - 知乎 (zhihu.com)

代码模板

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// ST https://www.luogu.com.cn/problem/P3865
const int N = 1e5 + 10;
int f[N][21]; // 用来记录 i 到 i + 2 ^ j - 1 区间内的最值 
int Log2[N];
void solve()
{
    int n,m; cin>>n>>m;
    for(int i = 1;i<=n;i++)  cin>>f[i][0];
    
    // 使用st表进行预处理
    for(int i = 1;i<=20;i++)
        for(int j = 1;j +(1 << i) - 1 <= n;j++)
            f[j][i] = max(f[j][i - 1],f[j + (1 << (i - 1))][i - 1]);
    
    // 递推Log
    for(int i = 2;i<=n;i++) Log2[i] = Log2[i / 2] + 1;
    
    for(int i = 0;i<m;i++){
        int l,r; cin>>l>>r;
        int m = 0;
        int s = Log2[r - l + 1];
        m = max(f[l][s],f[r - (1 << s) + 1][s]);
        cout<<m<<endl;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t = 1;  // cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

标签:洛谷,int,ST,fa,算法,LCA,include,com
From: https://blog.csdn.net/a1783760364/article/details/137430450

相关文章

  • 【阅读笔记】REST设计风格
    摘自:《凤凰架构:构建可靠的大型分布式系统》周志明著著者前言很多人会拿REST与RPC相比较,其实,REST无论是在思想上、在概念上,还是在使用范围上,与RPC都不尽相同,充其量只能算是有一些相似,应用会有一部分重合之处,但本质上并不是同一类型的东西。REST与RPC在思想上差异的核心是抽象......
  • 【题单】 洛谷图论题单
    这里写目录标题updata普及-普及/提高-普及+/提高提高+/省选-省选/NOI−NOI/NOI+/CTSCupdata2024.03.31发布此文章普及-P1359租用游艇P1636Einstein学画画(数据有误)P1700[USACO19OPEN]MilkFactoryBB3613图的存储与出边的排序B3643图的存储B3644【模......
  • 汇川AM400PLC一阶滞后滤波器使用介绍(FirstOrderLagFilter)
    1、一阶低通滤波器算法详细介绍PLC信号处理系列之一阶低通(RC)滤波器算法_数字rc滤波-CSDN博客文章浏览阅读4.1k次。1、先看看RC滤波的优缺点优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点;1、在模拟常数要求较大的场合这种算法显得更为实用;2、对......
  • 八皇后问题(洛谷P1219)
    在做洛谷上的题前我们看一下这样一道题题目描述会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对......
  • 当我们运行ur机械臂的包的时候我们想要在机械臂的末端加上六维力传感器,但是我们使用ro
    1、前言最近一个月在入门机械臂的控制,由于机械臂大部分都是用的是moveit,但是moveit都是集成好的,我为了实现自己的算法不打算使用moveit,因此我决定参考一个csdn的博主来进行复现,这篇文件是为了记录复现出现的问题。博主:孟德尔的猫链接:2如何给Gazebo中的仿真机械臂添加一个力......
  • AndroidStudio学习记录(3):操纵按钮控件Botton、ImageBotton
    按钮控件是平时看到的,常用Botton和ImageButton控件,一般操纵按钮来实现相应的命令,比如在手机上的查找登录注册,以及点击命令等等。ImaBotton与Button的区别在于它没有文本,只有图片,需要制定图片路径在activity_main.xml文件中,它们是这样使用的:<?xmlversion="1.0"encoding=......
  • c语言字符串函数(strlen strcpy strcat strcmp等使用及模拟)
    在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语⾔标准库中提供了一系列库函数,接下来我们就学习一下这些函数。目录1、strlen的使用及模拟实现。2、strcpy的使用及模拟实现。3、strcat的使用及模拟实现。4、strcmp的使用及模拟实现。5、strncpy的......
  • STM32f1时钟系统及配置
    文章目录11.11.222.12.22.3选择乘除结合就是时钟系统?11.11.2HSEf1是8M原理图里面有RC震荡器电阻电容构成优缺点:石英那个成本高但精确和稳定RC在内部成本低一般用外部系统时钟锁相环分频要用HSE1分频*9AHB高速高新能总线AHB上的总线该分频......
  • System文件夹
    system文件夹是正点原子提供的方便构建工程包含必备函数和驱动1驱动函数?被定义在sys.c声明在sys.h正点原子命名驱动文件里的函数按文件名开头?(delay?)int中断缩写系统复位包含软件复位硬件复位看门狗复位msp是栈顶指针在IAP相关实验用到最重要的是时钟这个......
  • 实战培训班:AIGC-Stablediffu+PS服装设计-服装设计师的人工智能课(16节)
    课程内容:1_一、先导片:课程介绍及课前准备-认识AI人工智能.mp42_二、Stablediffusion-基础学习-Stablediffusio运行的电脑配置要求.mp43_二、Stablediffusion-基础学习-Stablediffusio安装部署及注意事项.mp44_二、Stablediffusion-基础学习-SD-仙宫云部署.mp45_二、Stabl......