线段树
#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; }快读
标签:pre,int,long,板子,add,chen,mod From: https://www.cnblogs.com/yeahhhhhh/p/17649672.html