线段树求助 只有三行是错的
查看原帖
线段树求助 只有三行是错的
275860
___A__楼主2024/6/24 16:25

25行到27行错了 求改

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353,N=2e5+5;
struct segtree{
	int l,r,sumA,sumB,tagA,tagB,sum;
	segtree(){
		sumA=sumB=tagA=tagB=sum=0;
	}
}seg[N*4];
int n,T,a[N],b[N];
void pushup(int u){
	seg[u].sumA=(seg[u*2].sumA+seg[u*2+1].sumA)%mod,seg[u].sumB=(seg[u*2].sumB+seg[u*2+1].sumB)%mod,seg[u].sum=(seg[u*2].sum+seg[u*2+1].sum)%mod;
}
void build(int u,int l,int r){
	seg[u].l=l,seg[u].r=r;
	if(l==r){
		seg[u].sumA=a[l]%mod,seg[u].sumB=b[l]%mod,seg[u].sum=a[l]*b[l]%mod;
		return;
	}
	int mid=(l+r)>>1;
	build(u*2,l,mid),build(u*2+1,mid+1,r),pushup(u);
}
void addtag(int u,int A,int B){
	seg[u].tagA=(seg[u].tagA+A)%mod,seg[u].tagB=(seg[u].tagB+B)%mod;
	seg[u].sumA=(seg[u].sumA+(seg[u].r-seg[u].l+1)*A%mod)%mod,seg[u].sumB=(seg[u].sumB+B*(seg[u].r-seg[u].l+1)%mod)%mod;
	seg[u].sum=(seg[u].sum+seg[u].sumA*seg[u].tagB%mod+seg[u].tagA*seg[u].sumB%mod+seg[u].tagA*seg[u].tagB%mod)%mod;
}
void pushdown(int u){
	addtag(u*2,seg[u].tagA,seg[u].tagB),addtag(u*2+1,seg[u].tagA,seg[u].tagB),seg[u].tagA=seg[u].tagB=0;
}
int query(int u,int l,int r){
	if(seg[u].l>=l&&seg[u].r<=r){
		return seg[u].sum;
	}
	pushdown(u);
	int ret=0,mid=(seg[u].l+seg[u].r)>>1;
	if(l<=mid){
		ret=(ret+query(u*2,l,r))%mod;
	}
	else{
		ret=(ret+query(u*2+1,l,r))%mod;
	}
	return ret;
}
void update(int u,int l,int r,int A,int B){
	if(seg[u].l>=l&&seg[u].r<=r){
		addtag(u,A,B);
		return;
	}
	pushdown(u);
	int mid=(seg[u].l+seg[u].r)>>1;
	if(l<=mid){
		update(u*2,l,r,A,B);
	}
	if(r>mid){
		update(u*2+1,l,r,A,B);
	}
	pushup(u);
}
signed main(){
	cin>>n>>T;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	build(1,1,n);
	for(int typ,l,r,x;T--;){
		cin>>typ>>l>>r;
		if(typ==3){
			cout<<query(1,l,r)<<'\n';
		}
		else{
			cin>>x;
			if(typ==1){
				update(1,l,r,x,0);
			}
			else{
				update(1,l,r,0,x);
			}
		}
	}
}
2024/6/24 16:25
加载中...