【模板】ST表

核心思想:倍增

ST表是一个支持静态查询区间最大值的数据结构,预处理时间复杂度为 \(O(nlogn)\)\(O(1)\) 时间查询。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;

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

int n,q,st[maxn][21],lg[maxn];

void read_and_parse(){
	n=read(),q=read(),lg[0]=-1;
	for(int i=1;i<=n;i++){
		st[i][0]=read();
		lg[i]=lg[i>>1]+1;
	}
	for(int j=1;j<=20;j++)
		for(int i=1;i+(1<<j)-1<=n;i++)//注意范围,小心RE
			st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);
}

int query(int l,int r){
	int k=lg[r-l+1];
	return max(st[l][k],st[r-(1<<k)+1][k]);
}

void solve(){
	while(q--){
		int l=read(),r=read();
		printf("%d\n",query(l,r));
	}
}

int main(){
	read_and_parse();
	solve();
	return 0;
}
posted @ 2018-11-06 17:13  shellpicker  阅读(145)  评论(0编辑  收藏  举报