T了三个点求调,用的分块(不会线段树)

P3373 【模板】线段树 2

可能是被出题人对着卡了。。。本地随机数据跑得挺快的,学下线段树吧qwq
by Endline @ 2024-01-21 14:05:26


@[Endline](/user/401052) 谢了
by Bxiay @ 2024-01-21 14:07:41


@[Bxiay](/user/1116724) mod 改成常数跑得快多了 ```cpp #include<bits/stdc++.h> using namespace std; #define int long long const int maxn=320; const int mod=571373; int n,x,y,k,m,_,t,opt,p,q; int a[maxn*maxn],l[maxn],r[maxn],cheng[maxn],jia[maxn],pos[maxn*maxn],sum[maxn]; inline int read(){ int s = 0,f = 1; char ch = getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f = -1; ch = getchar(); } while(ch>='0'&&ch<='9'){ s = (s<<1)+(s<<3)+(ch^48); ch = getchar(); } return s*f; } void updatecheng(int x,int y,int k){ p=pos[x]; q=pos[y]; if(p==q){ sum[p]=0; for(int i=l[p];i<=r[p];i++){ a[i]=(a[i]*cheng[p]+jia[p])%mod; if(i>=x && i<=y) a[i]=a[i]*k%mod; sum[p]=(sum[p]+a[i])%mod; } cheng[p]=1; jia[p]=0; return; } for(int i=p+1;i<=q-1;i++){ sum[i]=sum[i]*k%mod; cheng[i]=cheng[i]*k%mod; jia[i]=jia[i]*k%mod; } sum[p]=0; for(int i=l[p];i<=r[p];i++){ a[i]=(a[i]*cheng[p]+jia[p])%mod; if(i>=x) a[i]=a[i]*k%mod; sum[p]=(sum[p]+a[i])%mod; } cheng[p]=1; jia[p]=0; sum[q]=0; for(int i=l[q];i<=r[q];i++){ a[i]=(a[i]*cheng[q]+jia[q])%mod; if(i<=y) a[i]=a[i]*k%mod; sum[q]=(sum[q]+a[i])%mod; } cheng[q]=1; jia[q]=0; } void updatejia(int x,int y,int k){ p=pos[x]; q=pos[y]; if(p==q){ sum[p]=0; for(int i=l[p];i<=r[p];i++){ a[i]=(a[i]*cheng[p]+jia[p])%mod; if(i>=x && i<=y) a[i]=(a[i]+k)%mod; sum[p]=(sum[p]+a[i])%mod; } cheng[p]=1; jia[p]=0; return; } for(int i=p+1;i<=q-1;i++){ sum[i]=(sum[i]+(r[i]-l[i]+1)*k)%mod; jia[i]=(jia[i]+k)%mod; } sum[p]=0; for(int i=l[p];i<=r[p];i++){ a[i]=(a[i]*cheng[p]+jia[p])%mod; if(i>=x) a[i]=(a[i]+k)%mod; sum[p]=(sum[p]+a[i])%mod; } cheng[p]=1; jia[p]=0; sum[q]=0; for(int i=l[q];i<=r[q];i++){ a[i]=(a[i]*cheng[q]+jia[q])%mod; if(i<=y) a[i]=(a[i]+k)%mod; sum[q]=(sum[q]+a[i])%mod; } cheng[q]=1; jia[q]=0; } int query(int x,int y){ int ans=0; p=pos[x]; q=pos[y]; if(p==q){ for(int i=x;i<=y;i++) ans=(ans+a[i]*cheng[p]+jia[p])%mod; return ans; } for(int i=p+1;i<=q-1;i++) ans=(ans+sum[i])%mod; for(int i=x;i<=r[p];i++) ans=(ans+a[i]*cheng[p]+jia[p])%mod; for(int i=l[q];i<=y;i++) ans=(ans+a[i]*cheng[q]+jia[q])%mod; return ans; } signed main(){ n=read(); m=read(); _=read(); for(int i=1;i<=n;i++){ a[i]=read(); } t=sqrt(n); for(int i=1;i<=t;i++){ l[i]=t*(i-1)+1; r[i]=t*i; } if(r[t]<n){ t++; l[t]=r[t-1]+1; r[t]=n; } for(int i=1;i<=t;i++){ for(int j=l[i];j<=r[i];j++){ pos[j]=i; sum[i]=(sum[i]+a[j])%mod; } } for(int i=1;i<=t;i++){ cheng[i]=1; } for(int o=1;o<=m;o++){ opt=read(); if(opt==1){ x=read(); y=read(); k=read(); updatecheng(x,y,k); } if(opt==2){ x=read(); y=read(); k=read(); updatejia(x,y,k); } if(opt==3){ x=read(); y=read(); printf("%lld\n",query(x,y)); } } return 0; } ```
by asas111 @ 2024-01-28 21:32:47


@[asas111](/user/661096) 感谢,我删去了几个取模后就通过了,而且还用线段树做了一次
by Bxiay @ 2024-01-29 14:34:57


|