线段树2模板求助
查看原帖
线段树2模板求助
361773
lishenghao楼主2022/8/16 13:35
#include<bits/stdc++.h>
#define ls pos<<1,l,mid
#define rs pos<<1|1,mid+1,r
#define N 100001
using namespace std;
struct node{
	int mul,plus,sum;
}t[N<<2];
int a[N];
int P,T,n;
void pushup(int pos)
{
	t[pos].sum=t[pos<<1].sum+t[pos<<1|1].sum;
	t[pos].sum%=P; 
//	cout<<t[pos].sum<<endl;
	return;
}
void Add(int pos,int l,int r,int fa)
{
	t[pos].mul*=t[fa].mul;
	t[pos].mul%=P;
	t[pos].plus*=t[fa].mul;
	t[pos].plus%=P;
	t[pos].plus+=t[fa].plus;
	t[pos].plus%=P;
	t[pos].sum*=t[fa].mul;
	t[pos].sum%=P;
	t[pos].sum+=t[fa].plus*(r-l+1);
	t[pos].sum%=P;
	return;
}
void pd(int pos,int l,int r)
{
	int mid=l+r>>1;
	Add(ls,pos);
	Add(rs,pos);
	t[pos].plus=0;
	t[pos].mul=1;
	return;
}
void build(int pos,int l,int r)
{ 
	t[pos].mul=1;
	t[pos].plus=0;
	if(l==r)
	{
		t[pos].sum=a[l];	
		return;
	}
	int mid=l+r>>1;
	build(ls);
	build(rs);
	pushup(pos);
}
void modify_mul(int pos,int l,int r,int ql,int qr,int ml)
{
	if(l>=ql&&r<=qr)
	{
		t[pos].mul*=ml;t[pos].mul%=P;
		t[pos].plus*=ml;t[pos].plus%=P;
		t[pos].sum*=ml;t[pos].sum%=P;
		return;
	}
	int mid=l+r>>1;
	pd(pos,l,r);
	if(ql<=mid)  modify_mul(ls,ql,qr,ml);
	if(qr>=mid+1)modify_mul(rs,ql,qr,ml);
	pushup(pos);
}
void modify_add(int pos,int l,int r,int ql,int qr,int ad)
{
	if(l>=ql&&r<=qr)
	{
		t[pos].plus+=ad;t[pos].plus%=P;
		t[pos].sum+=ad*(r-l+1);t[pos].sum%=P;
		return;
	}
	int mid=l+r>>1;
	pd(pos,l,r);
	if(ql<=mid)  modify_mul(ls,ql,qr,ad);
	if(qr>=mid+1)modify_mul(rs,ql,qr,ad);
	pushup(pos);
}
int query(int pos,int l,int r,int ql,int qr)
{
//	cout<<t[pos].sum<<endl;
	if(l>=ql&&r<=qr)
		return t[pos].sum;
	int mid=l+r>>1,r1=0,r2=0;
	pd(pos,l,r);
	if(ql<=mid)  r1=query(ls,ql,qr);
	if(qr>=mid+1)r2=query(rs,ql,qr);
	return (r1+r2)%P;
}
int main()
{
	int i;
	scanf("%d%d%d",&n,&T,&P);
	for(i=1; i<=n; i++)
		scanf("%d",&a[i]);
	build(1,1,n);
	short opt;
	int l,r,k;
	while(T--)
	{
		scanf("%d%d%d",&opt,&l,&r);
		if(opt==1)//*
		{
			scanf("%d",&k);
			modify_mul(1,1,n,l,r,k);
			//printf("%d\n",query(1,1,n,l,r));
		}
		else if(opt==2)//+
		{
			scanf("%d",&k);
			modify_add(1,1,n,l,r,k);
			//printf("%d\n",query(1,1,n,l,r));
		}
		else//opt==3  query
		{
			printf("%d\n",query(1,1,n,l,r));
		} 
	}
}

样例没过,悬赏关注

2022/8/16 13:35
加载中...