板子

线段树

#include<bits/stdc++.h>
using namespace std;
struct node {
    int l,r;
    long long pre,add,chen;
} t[1000000];
long long a[1000000];
long long n,m,mod;
void build(int p,int l,int r) {
    t[p].l=l;
    t[p].r=r;
    t[p].chen=1;
    if(l==r) {
        t[p].pre=a[l]%mod;
        return ;

    }
    long long mid=(l+r)>>1;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
}

void spread(long long p) {
    t[p*2].pre=(t[p*2].pre*t[p].chen+(t[p].add*(t[p*2].r-t[p*2].l+1))%mod)%mod;
    t[p*2+1].pre=(t[p*2+1].pre*t[p].chen+(t[p].add*(t[p*2+1].r-t[p*2+1].l+1)%mod))%mod;
    
    t[p*2+1].add=(t[p].add+(t[p*2+1].add*t[p].chen))%mod;
    t[p*2].add=(t[p].add+t[p*2].add*t[p].chen)%mod;

    t[p*2].chen=(t[p*2].chen*t[p].chen)%mod;
    t[p*2+1].chen=(t[p*2+1].chen*t[p].chen)%mod;
    
    t[p].chen=1;
    t[p].add=0;
    return ;
}
void change(int p,int x,int y,int z) {

    if(t[p].l>=x&&t[p].r<=y) {
        t[p].pre=(t[p].pre+z*(t[p].r-t[p].l+1))%mod;
        t[p].add=(t[p].add+z)%mod;
        return ;
    }
    spread(p);
    int mid=(t[p].r+t[p].l)>>1;
    if(x<=mid)change(p*2,x,y,z);
    if(y>mid)change(p*2+1,x,y,z);
    t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
    return ;
}
void change2(int p,int x,int y,int z) {
    if(t[p].l>=x&&t[p].r<=y) {
        t[p].add=(t[p].add*z)%mod;

        t[p].pre*=z;
        t[p].pre%=mod;

        t[p].chen*=z;
        t[p].chen%=mod;
        return ;
    }
    spread(p);
    int mid=(t[p].r+t[p].l)>>1;
    if(x<=mid)change2(p*2,x,y,z);
    if(y>mid)change2(p*2+1,x,y,z);
    t[p].pre=t[p*2].pre+t[p*2+1].pre;
    return ;
}
long long query(int p,int x,int y) {
    if(x<=t[p].l&&t[p].r<=y)return t[p].pre%mod;
    spread(p);
    int mid=(t[p].r+t[p].l)>>1;
    long long ans=0;
    if(x<=mid)ans+=query(p*2,x,y)%mod;
    if(y>mid)ans+=query(p*2+1,x,y)%mod;
    ans%=mod;
    return ans;
}
int main() {
    
    scanf("%d%d%d",&n,&m,&mod);
    for(int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    for(int i=1; i<=m; i++) {
        int q;
        scanf("%d",&q);
        if(q==2) {
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            change(1,x,y,k);
        }
        else if(q==1) {
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            change2(1,x,y,k);
        } else {
            int x,y;
            scanf("%d%d",&x,&y);
            cout<<query(1,x,y)<<endl;
        }
    }
    return 0;

}
线段树

ST表

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

int q;
int dp1[100005][100];
int h[1000000];
void work1( ){
    for(int i=1;i<=n;i++)dp1[i][0]=h[i];
    for(int i=1;(1<<i)<=n;i++){
        for(int j=1;j+(1<<i)-1<=n;j++){
            dp1[j][i]=max(dp1[j][i-1],dp1[j+(1<<(i-1))][i-1]);
        }
    }
    return ;
}
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int RMQ1(int l,int r){
    int k=0;
    while((1<<k+1)<=(r-l+1))k++;
    
    return max(dp1[l][k],dp1[r-(1<<k)+1][k]);
}

int main(){
n=read();
q=read();
for(int i=1;i<=n;i++){
    cin>>h[i];
}
work1();

for(int i=1;i<=q;i++){
    int a,b;
    a=read();
    b=read();
    printf("%d\n",RMQ1(a,b));
}
    return 0;
}
ST表

快读

#include<bits/stdc++.h>
using namespace std;
int read(){
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^8),ch=getchar();
    return x;
}
int n;
int a[1000000];
int main() {
cin>>n;
for(int i=1;i<=n;i++){
    a[i]=read();
}
    return 0;

}
快读

 

posted @ 2023-10-13 13:44  yeahhhhhh  阅读(16)  评论(0)    收藏  举报