Day01 ST表——倍增表
注意:
推荐算法书:算法竞赛(2022年出的)
1<<x:2^x!!! 比pow(2,x)快!!!
i>>1:i/2 !!!
输入输出数据量超过1e5+10:用io优化 或者 scanf 、printf
1e9 数量级 大约 2^31幂次
#define int long long // 输入要用lld scanf 所以不建议全体开long long,易忘。
ST表
P3865 【模板】ST 表 && RMQ 问题 - 洛谷
#include<bits/stdc++.h>
using namespace std;/*
ST(倍增表)
状态:st[i][j] 代表区间[i,i+2^j-1]的最值,其中i是区间的左端点,区间长度是2^j
边界 st[i][0]=a[i]状态转移方程:st[i][j] = max(st[i][j-1],st[i+2^(j-1)][j-1])求区间[l,r]的最值
len = r-l+1
x = log2(len)
max = max(st[l][x],st[r-2^x+1][x]) //O(1)
*/const int N = 1e5 + 10 ;
int a[N],st[N][30];
int n,m;
int lb[N]; //lb[i] 《==》 log2(i) void init_log(){lb[1]=0;//lb[2]=lb[1]+1=1//lb[3]=lb[1]+1=1//lb[4]=lb[2]+1=2for(int i=2;i<=n;i++) lb[i]=lb[i>>1]+1;
}//创建st表时间复杂度:O(nlogn)
void create_st(){for(int j = 1 ; j <= lb[n]; j++){for(int i = 1 ; i + (1<<j) -1 <= n ; i++){st[i][j] = max(st[i][j-1],st[i+(1<<(j-1))][j-1]);}}
}//区间最值查询:O(1)
int query(int l,int r){int x = lb[r-l+1];return max(st[l][x],st[r-(1<<x)+1][x]);
}int main(){cin>>n>>m;for(int i=1;i<=n;i++){//cin>>a[i];scanf("%d",&a[i]);st[i][0]=a[i]; //st[i][0]代表区间[i,i]的最值 }init_log();create_st();while(m--){int l,r; //cin>>l>>r;scanf("%d %d",&l,&r);printf("%d\n",query(l,r));//cout<<query(l,r)<<endl;} return 0;
}
类型题:
区间选数k 蓝桥账户中心
附近最小 蓝桥账户中心
GCD不小于K的子数组 蓝桥账户中心
完结!!!⠀՞⸝⸝. .⸝⸝՞˳ഒ