IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 关于ST表的建立与查询(板子) -> 正文阅读

[C++知识库]关于ST表的建立与查询(板子)

关于ST表的建立与查询(板子)

题目描述:

输入一串数字,给你M个询问,每次询问就给你两个数字 X,Y,要求你说出X到Y这段区间内的最大数。

输入:

第一行两个整数 N,M 表示数字的个数和要询问的次数;

接下来一行为 N 个数;

接下来 M 行,每行都有两个整数 X,Y。

输出:

输出共 M 行,每行输出一个数。

输入样例:

10 2
3 2 4 5 6 8 1 2 9 7
1 4
3 8

输出样例:

5
8

Tip:
对于全部数据, 1 1 1 ≤ \le N N N ≤ \le 1 e 5 1e5 1e5, 1 1 1 ≤ \le M M M ≤ \le 1 e 6 1e6 1e6, 1 1 1 ≤ \le X X X ≤ \le Y Y Y ≤ \le N N N

思路: 显然直接暴力即使预处理再查询时间复杂度也来到 1 e 10 1e10 1e10级别。预处理每一段的 m a x max max这时候就可以使用ST表

ST表主要有两个操作:
1 : 1: 1: O ( n l o g n ) O(nlogn) O(nlogn)级别的复杂度预处理所有 2 2 2的次方长度的区间。
2:之后的每一次查询的区间都可以通过: m a x ( s t [ L ] [ k ] , s t [ R ? ( 1 < < k ) + 1 ] [ k ] ) max(st[L][k],st[R-(1<<k)+1][k]) max(st[L][k],st[R?(1<<k)+1][k])来获得。 s t st st数组的第一维表示以哪个坐标为起点, k k k表示是总长度为 2 k 2^k 2k的区间。

核心代码:
1 : m a k e 1:make 1:make_ s t ( ) st() st()

void make_st(){
    int k=__lg(n);
    for(int i=1;i<=n;i++)st[i][0]=a[i];
    for(int i=1;i<=k;i++){
        for(int j=1;j+(1<<i)-1<=n;j++){
            st[j][i]=max(st[j][i-1],st[j+(1<<(i-1))][i-1]);
        }
    }
}

2 : i n t 2:int 2:int q u e r y ( query( query( i n t int int l , i n t l,int l,int r ) r) r)

int query(int l,int r){
    int k=__lg(r-l+1);
    return max(st[l][k],st[r-(1<<k)+1][k]);
}
  • 本题参考代码:
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define int long long 
#define re register int
#define pb emplace_back
#define lowbit(x) (x&-x)
#define fer(i,a,b) for(re i = a ; i <= b ; i ++)
#define der(i,a,b) for(re i = a ; i >= b ; i --)
#define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
typedef pair<int,int>PII;
typedef pair<int,string>PIS;
int n,m;
const int N=2e5+10;
int a[N];
int st[N][20];
void make_st(){
    int k=__lg(n);
    for(int i=1;i<=n;i++)st[i][0]=a[i];
    for(int i=1;i<=k;i++){
        for(int j=1;j+(1<<i)-1<=n;j++){
            st[j][i]=max(st[j][i-1],st[j+(1<<(i-1))][i-1]);
        }
    }
}
int query(int l,int r){
    int k=__lg(r-l+1);
    return max(st[l][k],st[r-(1<<k)+1][k]);
}
signed main(){
    snow;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    make_st();
    while(m--){
        int l,r;
        cin>>l>>r;
        cout<<query(l,r)<<endl;
    }
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:32:58  更:2022-02-05 21:34:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:16:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码