st表

1.luogu 1198 最大数

逆序st表,专用于取最大值,递推log

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int N=200050;
const int Logn=25;

inline ll read(){
    ll x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;}
    
ll a[N],f[N][Logn],lg[N];
ll n,m,x,l,ans,t,D;
char ch;

void change(ll u){  
    f[u][0]=a[u];
    for(ll i=1;(1<<i)<=u;i++) f[u][i]=max(f[u][i-1],f[u-(1<<(i-1))][i-1]);}
ll find(ll x,ll y){
    ll s=lg[y-x+1];
    return max(f[y][s],f[x+(1<<s)-1][s]);}
    
int main(){
    lg[0]=-1;
    scanf("%d%lld",&m,&D);
    for (ll i=1;i<=m;i++){
        char ch;cin>>ch;
        if(ch=='A'){
            x=read();
            a[++n]=(x+t)%D;
            lg[n]=lg[n>>1]+1;      
            change(n);
        }else if(ch=='Q'){
            l=read();
            if(l==1){
                printf("%lld\n",a[n]);
                t=a[n];continue;}
            ans=find(n-l+1,n);
            printf("%lld\n",ans);t=ans;
        }
    }
    return 0;
}

模板

#include<bits/stdc++.h>
using namespace std;

const int Logn=20;
const int N=1e6+5;

int lg[N],f[N][Logn+5],a[N],n,m;

int main(){
    
    int n,m;cin>>n>>m;
    lg[0]=-1;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) f[i][0]=a[i],lg[i]=lg[i>>1]+1;
    
    for(int j=1;j<=Logn;j++)
    for(int i=1;i+(1<<j)-1<=n;i++)
       f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
    
    while(m--){
        int x,y;
        cin>>x>>y;
        int s=lg[y-x+1];
        printf("%d\n",max(f[x][s],f[y-(1<<s)+1][s]));
    }return 0;
}

 

posted @ 2018-09-02 11:28  ASDIC减除  阅读(148)  评论(0编辑  收藏  举报