[luogu P3865] 【模板】ST表

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/84345618

题目

https://www.luogu.org/problemnew/show/P3865#sub


解题思路

s t st 表可以有很多用途,例如RMQ问题
其他更多模板请见(https://blog.csdn.net/qq_39897867/article/details/83623201)


代码

#include<cstdio>
#include<cmath>
#include<cstring>
#define rr register
using namespace std; 
int n,m,x,y,f[100003][18]; 
inline int maxx(int x,int y){return x>y?x:y;}
inline int read()
{
	int p=0,f=1; char c; c=getchar(); 
	while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); } 
	while (c>='0'&&c<='9') p=(p<<3)+(p<<1)+c-48,c=getchar();
	return p*f;  
}
void ST_prework()
{
	int t=log(n)/log(2)+1; 
	for (rr int j=1;j<t;j++)
	 for (rr int i=1;i<=n-(1<<j)+1;i++)
	 f[i][j]=maxx(f[i][j-1],f[i+(1<<(j-1))][j-1]); 
}
inline int ST_query(int l,int r)
{
	int k=log(r-l+1)/log(2); 
	return maxx(f[l][k],f[r-(1<<k)+1][k]); 
}
int main()
{
	n=read(); m=read(); 
	for (rr int i=1;i<=n;i++) f[i][0]=read(); 
	ST_prework(); 
	for (rr int i=1;i<=m;i++)
	 	x=read(),y=read(),printf("%d\n",ST_query(x,y)); 
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/84345618
今日推荐