蒟蒻萌新线段树写挂,有没有大佬能帮忙QAQ

P3373 【模板】线段树 2

pushdown区间写错了,这是我的code,sum=你的data,mul,add你看得懂吧 ```cpp tree[id<<1].sum=(tree[id].mul*tree[id<<1].sum+tree[id].add*(tree[id<<1].r-tree[id<<1].l+1))%mod; tree[id<<1|1].sum=(tree[id].mul*tree[id<<1|1].sum+tree[id].add*(tree[id<<1|1].r-tree[id<<1|1].l+1))%mod; tree[id<<1].mul=(tree[id<<1].mul*tree[id].mul)%mod; tree[id<<1|1].mul=(tree[id<<1|1].mul*tree[id].mul)%mod; tree[id<<1].add=(tree[id<<1].add*tree[id].mul+tree[id].add)%mod; tree[id<<1|1].add=(tree[id<<1|1].add*tree[id].mul+tree[id].add)%mod; tree[id].mul=1; tree[id].add=0; ```
by zyh0516_lucky @ 2023-10-10 00:25:46


写反了吧 ```cpp updatemul(int l,int r,int s,int c,int t,int p) ``` ```cpp if(l<=s && c<=r) ``` ```cpp updatemul(l,r,1,n,k%m,1) ```
by zyh0516_lucky @ 2023-10-10 00:29:21


```cpp void updateadd(int l,int r,int s,int c,int t,int p){ if(l<=s && c<=r){ tree[p].data=(tree[p].data+(c-s+1)*t)%m,tree[p].addlazy+=t;//忘模了吧 ```
by zyh0516_lucky @ 2023-10-10 00:32:37


可能还有错,这是我的代码,应该挺好懂的吧 ```cpp #include <bits/stdc++.h> #define MAXN 100005 #define ll long long using namespace std; ll n,m,a[MAXN],mod; struct node{ ll l,r,sum,add,mul; }tree[MAXN*4]; void push_down(ll id){ tree[id<<1].sum=(tree[id].mul*tree[id<<1].sum+tree[id].add*(tree[id<<1].r-tree[id<<1].l+1))%mod; tree[id<<1|1].sum=(tree[id].mul*tree[id<<1|1].sum+tree[id].add*(tree[id<<1|1].r-tree[id<<1|1].l+1))%mod; tree[id<<1].mul=(tree[id<<1].mul*tree[id].mul)%mod; tree[id<<1|1].mul=(tree[id<<1|1].mul*tree[id].mul)%mod; tree[id<<1].add=(tree[id<<1].add*tree[id].mul+tree[id].add)%mod; tree[id<<1|1].add=(tree[id<<1|1].add*tree[id].mul+tree[id].add)%mod; tree[id].mul=1; tree[id].add=0; return; } void push_up(ll id){ tree[id].sum=(tree[id<<1].sum+tree[id<<1|1].sum)%mod; return; } void build(ll l,ll r,ll id){ tree[id].l=l; tree[id].r=r; tree[id].mul=1; tree[id].add=0; if(l==r){ tree[id].sum=a[l]%mod; return; } ll mid=l+r>>1; build(l,mid,id<<1); build(mid+1,r,id<<1|1); push_up(id); return; } void update_mul(ll l,ll r,ll id,ll k){ if(l<=tree[id].l&&tree[id].r<=r){ tree[id].mul=(tree[id].mul*k)%mod; tree[id].add=(tree[id].add*k)%mod; tree[id].sum=(tree[id].sum*k)%mod; return; } push_down(id); ll mid=(tree[id].l+tree[id].r)>>1; if(l<=mid) update_mul(l,r,id<<1,k); if(r>mid) update_mul(l,r,id<<1|1,k); push_up(id); return; } void update_add(ll l,ll r,ll id,ll k){ if(l<=tree[id].l&&tree[id].r<=r){ tree[id].add=(tree[id].add+k)%mod; tree[id].sum=(tree[id].sum+k*(tree[id].r-tree[id].l+1))%mod; return; } push_down(id); ll mid=(tree[id].l+tree[id].r)>>1; if(l<=mid) update_add(l,r,id<<1,k); if(r>mid) update_add(l,r,id<<1|1,k); push_up(id); return; } ll query(ll l,ll r,ll id){ if(l<=tree[id].l&&tree[id].r<=r) return tree[id].sum; push_down(id); ll val=0; ll mid=(tree[id].l+tree[id].r)>>1; if(l<=mid) val=(val+query(l,r,id<<1))%mod; if(r>mid) val=(val+query(l,r,id<<1|1))%mod; return val; } int main(){ ll pos,x,y,k; scanf("%lld %lld %lld",&n,&m,&mod); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,n,1); while(m--){ scanf("%lld",&pos); if(pos==1){ scanf("%lld %lld %lld",&x,&y,&k); update_mul(x,y,1,k); } if(pos==2){ scanf("%lld %lld %lld",&x,&y,&k); update_add(x,y,1,k); } if(pos==3){ scanf("%lld %lld",&x,&y); printf("%lld\n",query(x,y,1)); } } return 0; } ```
by zyh0516_lucky @ 2023-10-10 00:36:47


|