1. 程式人生 > >[luogu P3865] 【模板】ST表

[luogu P3865] 【模板】ST表

題目

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; }