线段树 区间+* 30分求助

P3373 【模板】线段树 2

全开long long试试
by Froggy @ 2019-01-11 12:45:38


@[肥婆纳妾](/space/show?uid=119067)
by Froggy @ 2019-01-11 12:45:43


@[Froggy](/space/show?uid=100285) 谢谢你的建议,但我也只有 l, r 下标 没开longlong 其它全是 longlong ,应该不是这儿的问题,难受ing
by 肥婆纳妾 @ 2019-01-11 16:53:22


@[肥婆纳妾](/space/show?uid=119067) 更新时没更新根结点 (我也犯过同样的错误)
by Froggy @ 2019-01-12 19:20:07


```cpp #include<iostream> using namespace std; #define N 1000010 int n,m; long long p,a[N]; struct node{ int l,r; long long num,add,mul; }tree[4*N]; void build(int i,int l,int r){ tree[i].l=l; tree[i].r=r; tree[i].mul=1; tree[i].add=0; if(l==r){ tree[i].num=a[l]; return ; } int mid=(tree[i].l+tree[i].r)/2; build(i*2,l,mid); build(i*2+1,mid+1,r); tree[i].num=(tree[i*2].num+tree[i*2+1].num)%p; } void spread(int i){ if(tree[i].add||tree[i].mul!=1){ tree[i*2].num=(tree[i*2].num*tree[i].mul+tree[i].add*(tree[i*2].r-tree[i*2].l+1))%p; tree[i*2+1].num=(tree[i*2+1].num*tree[i].mul+tree[i].add*(tree[i*2+1].r-tree[i*2+1].l+1))%p; tree[i*2].mul=(tree[i*2].mul*tree[i].mul)%p; tree[i*2+1].mul=(tree[i*2+1].mul*tree[i].mul)%p; tree[i*2].add=(tree[i*2].add*tree[i].mul+tree[i].add)%p; tree[i*2+1].add=(tree[i*2+1].add*tree[i].mul+tree[i].add)%p; tree[i].add=0; tree[i].mul=1; } } void _plus(int i,int l,int r,int d){ if(tree[i].l>=l&&tree[i].r<=r){ tree[i].num+=(long long)d*(tree[i].r-tree[i].l+1); tree[i].add+=d; return; } spread(i); int mid=(tree[i].l+tree[i].r)/2; if(l<=mid){ _plus(i*2,l,r,d); } if(r>mid){ _plus(i*2+1,l,r,d); } tree[i].num=tree[i*2].num+tree[i*2+1].num;//here } void _pow(int i,int l,int r,int d){ if(tree[i].l>=l&&tree[i].r<=r){ tree[i].num=(tree[i].num*d)%p; tree[i].mul=(tree[i].mul*d)%p; tree[i].add=(tree[i].add*d)%p; return; } spread(i); int mid=(tree[i].l+tree[i].r)/2; if(l<=mid){ _pow(i*2,l,r,d); } if(r>mid){ _pow(i*2+1,l,r,d); } tree[i].num=(tree[i*2].num+tree[i*2+1].num)%p;//here } long long ask(int i,int l,int r){ if(tree[i].l>=l&&tree[i].r<=r){ return tree[i].num; } spread(i); int mid=(tree[i].l+tree[i].r)/2; long long val=0; if(l<=mid){ val+=ask(i*2,l,r); } if(r>mid){ val+=ask(i*2+1,l,r); } return val; } int main(){ cin>>n>>m>>p; for(int i=1;i<=n;i++){ cin>>a[i]; } build(1,1,n); for(int i=1;i<=m;i++){ int x,l,r,k; cin>>x>>l>>r; if(x==1){ cin>>k; _pow(1,l,r,k); } else if(x==2){ cin>>k; _plus(1,l,r,k); } else{ cout<<ask(1,l,r)%p<<endl; } } return 0; } ```
by Froggy @ 2019-01-12 19:39:17


@[Froggy](/space/show?uid=100285) 谢了,现在已经 把问题解决了
by 肥婆纳妾 @ 2019-01-13 01:07:54


|