ABC_347_F求调qwq
  • 板块学术版
  • 楼主for_cat
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/8 21:41
  • 上次更新2024/6/9 07:36:57
查看原帖
ABC_347_F求调qwq
758472
for_cat楼主2024/6/8 21:41
#include <iostream>
#define int long long
using namespace std;
const int mod=998244353;
const int N=2e5+5;
int a[N],b[N];
struct sg{
	int taga,tagb;
	int suma,sumb;
	int facj;
}d[4*N];
void pushdown(int x,int l,int r){
	if(l!=r){
		int mid=(l+r)/2;
		d[x*2].facj+=d[x].taga*d[x*2].sumb;
		d[x*2+1].facj+=d[x].taga*d[x*2+1].sumb;
		d[x*2].facj+=d[x].tagb*d[x*2].suma;
		d[x*2+1].facj+=d[x].tagb*d[x*2+1].suma;
		d[x*2].suma+=d[x].taga*(mid-l+1);
		d[x*2+1].suma+=d[x].taga*(r-mid);
		d[x*2].sumb+=d[x].tagb*(mid-l+1);
		d[x*2+1].sumb+=d[x].tagb*(r-mid); 
		d[x*2].taga+=d[x].taga;
		d[x*2+1].taga+=d[x].taga;
		d[x*2].tagb+=d[x].tagb;
		d[x*2+1].tagb+=d[x].tagb;
		d[x].taga=0;
		d[x].tagb=0;
	}
}
void build(int x,int l,int r){
	if(l==r){
		d[x].suma=a[l];
		d[x].sumb=b[l];
		d[x].facj+=d[x].suma*d[x].sumb;
		d[x].facj%=mod;
		return ;
	}
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	d[x].suma=d[x*2].suma+d[x*2+1].suma;
	d[x].sumb=d[x*2+1].sumb+d[x*2+1].sumb;
	d[x].facj=d[x*2].facj+d[x*2+1].facj;
	//cout<<x<<' '<<d[x].suma<<' '<<d[x].sumb<<' '<<d[x].facj<<"***\n"; 
} 
void modify1(int x,int l,int r,int a,int b,int k){
	pushdown(x,l,r);
	if(l==a&&r==b){
		d[x].facj+=d[x].suma*k;
		d[x].facj%=mod;
		d[x].sumb+=(r-l+1)*k;
		d[x].sumb%=mod;
		return ;
	}
	int mid=(l+r)/2;
	if(b<=mid){
		modify1(x*2,l,mid,a,b,k);
	}
	else{
		if(a>=mid+1){
			modify1(x*2+1,mid+1,r,a,b,k);
		}
		else{
			modify1(x*2,l,mid,a,mid,k);
			modify1(x*2+1,mid+1,r,mid+1,b,k);
		}
	}
	d[x].facj=d[x*2].facj+d[x*2+1].facj;
}
void modify2(int x,int l,int r,int a,int b,int k){
	pushdown(x,l,r);
	if(l==a&&r==b){
		d[x].facj+=d[x].sumb*k;
		d[x].facj%=mod;
		d[x].suma+=(r-l+1)*k;
		d[x].suma%=mod;
		return ;
	}
	int mid=(l+r)/2;
	if(b<=mid){
		modify2(x*2,l,mid,a,b,k);
	}
	else{
		if(a>=mid+1){
			modify2(x*2+1,mid+1,r,a,b,k);
		}
		else{
			modify2(x*2,l,mid,a,mid,k);
			modify2(x*2+1,mid+1,r,mid+1,b,k);
		}
	}
	d[x].facj=d[x*2].facj+d[x*2+1].facj;
}
int find(int x,int l,int r,int a,int b){
	pushdown(x,l,r);
	if(l==a&&r==b){
		return d[x].facj;
	}
	int mid=(l+r)/2;
	if(b<=mid){
		return find(x*2,l,mid,a,b);
	}
	else{
		if(a>=mid+1){
			return find(x*2+1,mid+1,r,a,b);
		}
		else{
			return find(x*2,l,mid,a,mid)+find(x*2+1,mid+1,r,mid+1,b); 
		}
	}
}
signed main(){
	int n,q;
	cin>>n>>q;
	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 i=1;i<=q;i++){
		int opt;
		cin>>opt;
		if(opt==1){
			int l,r,x;
			cin>>l>>r>>x;
			modify2(1,1,n,l,r,x); 
		}
		else{
			if(opt==2){
				int l,r,x;
				cin>>l>>r>>x;
				modify1(1,1,n,l,r,x); 
			}
			else{
				int l,r;
				cin>>l>>r;
				cout<<find(1,1,n,l,r)<<"\n";
			}
		}
	}
	return 0;
}
2024/6/8 21:41
加载中...