Martian148's blog Martian148's blog
首页
  • ICPC 算法笔记
  • ICPC 算法题解
  • 体系结构
  • 高等数学
  • 线性代数
  • 概率论与数理统计
  • 具体数学
  • Martian148的奇思妙想
  • 游记
  • 通识课笔记
关于
  • useful 网站
  • 友情链接
  • 分类
  • 归档

Martian148

一只热爱文科的理科生
首页
  • ICPC 算法笔记
  • ICPC 算法题解
  • 体系结构
  • 高等数学
  • 线性代数
  • 概率论与数理统计
  • 具体数学
  • Martian148的奇思妙想
  • 游记
  • 通识课笔记
关于
  • useful 网站
  • 友情链接
  • 分类
  • 归档
  • 线上赛板子(实时更新)
  • 数据结构

  • 数学

  • 计算几何

  • 动态规划

  • 图论

  • 字符串

  • 杂项

    • 01分数规划
    • 莫队
    • CDQ分治
    • 离散化
    • RMQ
      • ST表
    • 悬线法
    • 模拟退火
    • 整体二分
    • Blog 对拍 Debug 复杂度
  • 算法笔记
  • 杂项
martian148
2024-09-03
目录

RMQ

# RMQ

# ST表

ST 表基于倍增思想,可以做到 O(nlog⁡n)O(n\log n)O(nlogn) 预处理,O(1)O(1)O(1) 回答每个询问。来处理区间最大值或者区间 gcd 问题,但是不支持修改操作

定义 f[i][j]f[i][j]f[i][j] 表示区间 [i,i+2j−1][i,i+2^j-1][i,i+2j−1] 的最大值,显然 f(i,0)=aif(i,0)=a_if(i,0)=ai​

根据定义式,第二维就相当于倍增的时候跳了 2j−12^j-12j−1 步

image.png

所以预处理的转移方程自然而然就可以得出了:

f[i][j]=max⁡(f[i][j−1],f[i+2j−1][j−1]) f[i][j]=\max(f[i][j-1],f[i+2^{j-1}][j-1]) f[i][j]=max(f[i][j−1],f[i+2j−1][j−1])

对于每个询问 [l,r][l,r][l,r] 我们分成两部分:[l,l+2s−1][l,l+2^s-1][l,l+2s−1] 与 [r−2s+1,r][r-2^s+1,r][r−2s+1,r],其中 s=⌊log⁡2(r−l+1)⌋s=\lfloor\log_2(r-l+1)\rfloors=⌊log2​(r−l+1)⌋

image.png
#include <bits/stdc++.h>
using namespace std;
int main() {
    freopen ("P3865.in", "r", stdin);
    int n, m; cin >> n >> m;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    vector<vector<int> > f(n + 1, vector<int>(20));
    vector<int> lg2(n + 1, 0);
    for (int i = 1; i <= n; i++)
        f[i][0] = a[i];
    for (int i = 2; i <= n; i++)
        lg2[i] = lg2[i >> 1] + 1;
    for (int j = 1; j < 20; j++)
        for (int i = 1; i + (1 << j) - 1 <= n; i++)
            f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
    auto query = [&] (int l, int r) {
        int s = lg2[r - l + 1];
        return max(f[l][s], f[r - (1 << s) + 1][s]);
    };
    while (m--) {
        int l, r; cin >> l >> r;
        cout << query(l, r) << '\n';
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
上次更新: 2025/04/08, 18:03:31
离散化
悬线法

← 离散化 悬线法→

最近更新
01
Java基础语法
05-26
02
开发环境配置
05-26
03
pink 老师 JavaScript 学习笔记
05-26
更多文章>
Theme by Vdoing | Copyright © 2024-2025 Martian148 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式