分块70TLE求调
查看原帖
分块70TLE求调
767096
TKXZ133楼主2022/12/21 11:18

萌新刚学分块,跑来切分块模板题,被#2,#9,#10摁在地上摩擦
除了这三个点,别的点都跑得飞快,这三个点T得飞起,求助大佬帮忙卡常

#include <bits/stdc++.h>
using namespace std;
const int N=100100,L=400,mod=571373;
typedef long long ll;

int n,m,op,in1,in2,in3,S,inp[N];

int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||'9'<ch){if(ch=='-')f=-1;ch=getchar();}
    while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}

void write(ll x){
    if(x<0){putchar('-');x=-x;}
    ll k=x/10;if(k) write(k);
    putchar(x-(k<<3)-(k<<1)+'0');
    return ;
}

struct Bdn{int l,r;ll sum,t1,t2;};
struct Bd{
    Bdn a[L];ll num[N],sum[N];
    void build(){
        for(int i=1,j=1;i<=n;i++){
            if(!i%S){j++;a[j].l=i;}
            if(i%S==S-1) a[j].r=i;
            num[i]=j;sum[i]=inp[i];
            a[j].sum+=sum[i];
            a[j].t1=0;a[j].t2=1;
        }
    }
    void add_t(int l,int r,int k,int p){
        for(int i=l;i<=r;i++)
            sum[i]=sum[i]+k;
        a[p].sum=a[p].sum+k*(r-l+1)%mod;
        return ;
    }
    void add(int l,int r,int k){
        if(num[l]==num[r]){add_t(l,r,k,num[l]);return ;}
        add_t(l,a[num[l]].r,k,num[l]);
        add_t(a[num[r]].l,r,k,num[r]);
        for(int i=num[l]+1;i<=num[r]-1;i++){
            a[i].sum=a[i].sum+k*(a[i].r-a[i].l+1)%mod;
            a[i].t1=a[i].t1+k;
        }
        return ;    
    }
    void mul_t(int l,int r,int k,int p){
        ll change=0;
        for(int i=l;i<=r;i++){
            change=change+sum[i]*(k-1)%mod;
            sum[i]=sum[i]*k%mod;
        }
        a[p].sum=(a[p].sum+change)%mod;
    }
    void mul(int l,int r,int k){
        if(num[l]==num[r]){mul_t(l,r,k,num[l]);return ;}
        mul_t(l,a[num[l]].r,k,num[l]);
        mul_t(a[num[r]].l,r,k,num[r]);
        for(int i=num[l]+1;i<=num[r]-1;i++){
            a[i].sum=(a[i].sum*k%mod);
            a[i].t1=(a[i].t1*k%mod);
            a[i].t2=(a[i].t2*k%mod);
        }
        return ;
    }
    ll ask_t(int l,int r,int p){
        ll res=0;
        for(int i=l;i<=r;i++)
            res=(res+sum[i])%mod;
        res=(res*a[p].t2)%mod;
        res=(res+a[p].t1*(r-l+1))%mod;
        return res;
    }
    ll ask(int l,int r){
        if(num[l]==num[r]){return ask_t(l,r,num[l]);}
        ll res=0;
        res=(res+ask_t(l,a[num[l]].r,num[l]))%mod;
        res=(res+ask_t(a[num[r]].l,r,num[r]))%mod;
        for(int i=num[l]+1;i<=num[r]-1;i++)
            res=(res+a[i].sum)%mod;
        return res;
    }
}bd;

int main(){
    n=read();m=read();op=read();
    S=sqrt(n);
    for(int i=1;i<=n;i++)
        inp[i]=read();
    bd.build();
    while(m--){
        op=read();
        if(op==1){in1=read();in2=read();in3=read();bd.mul(in1,in2,in3);}
        if(op==2){in1=read();in2=read();in3=read();bd.add(in1,in2,in3);}
        if(op==3){in1=read();in2=read();write(bd.ask(in1,in2));putchar('\n');}
    }
    return 0;
}
2022/12/21 11:18
加载中...