2023-02-14 算法学习——树状数组/ST表

2024-03-01  本文已影响0人  Lovevivi

树状数组用于解决动态查询区间,单点修改的情况
前缀和用于解决静态区间和的情况
差分用于解决多次修改区间值,最后求和(用前缀和)的情况

st表模板

#include<iostream>
using namespace std;

inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*f;
}

int a[1000010],st[1000010][32];

int query(int l,int r) {
    int k = 0;
    while(1<<k <= r-l+1) k++;k--; //最后多加了一次
    return max(st[l][k],st[r-(1<<k)+1][k]);
}

int main() {
    int n = read(),m = read();
    // cout<<n<<m<<endl;
    for(int i=0;i<n;i++) a[i] = read();

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


    while (m--) {
        int l=read(),r=read();
        printf("%d\n",query(l-1,r-1));
    }
    
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读