ST表
题目来源 【模板】ST 表
代码
#include<cstdio> int n,m,l,r,lg[100005],a[100005],st[100005][35]; inline int max(int x,int y){ return x>y?x:y; } inline void f(){ for(int i=2;i<=n;i++) lg[i]=lg[i-1]+(1<<(lg[i-1]+1)==i); //lg[i]=log(2,i), 递推实现避免浮点可能产生的误差 //或写成lg[i]=lg[i/2]+1 for(int i=1;i<=n;i++) st[i][0]=a[i]; for(int j=1;(1<<j)<=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]); //对于其他类似的题目阔以用__gcd(), min(), etc } inline void solve(int L,int R){ int len=lg[R-L+1]; printf("%d\n",max(st[L][len],st[R-(1<<len)+1][len])); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",a+i); f(); while(m--){ scanf("%d%d",&l,&r); solve(l,r);//求l到r区间的最小值 } return 0; }
思路
初学ST表,在洛谷上刷道ST表模板题,详细见代码注释,有出错的地方还请大神指正 =)
代码第14行感觉用这张图片(下面视频链接里有)比较好理解: