简单的爱心效果

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行感觉用这张图片(下面视频链接里有)比较好理解:

posted @ 2023-03-23 18:51  Light-Chaser  阅读(48)  评论(0编辑  收藏  举报
简单的爱心效果