社区讨论

萌新初学 条理清晰 阳寿已折 30分求助

P3373【模板】线段树 2参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo98u85y
此快照首次捕获于
2023/10/28 07:27
2 年前
此快照最后确认于
2023/10/28 07:27
2 年前
查看原帖
C
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;//10倍
#define int long long//long long
int mod;
int n,m;int opt;int l2,r2,z;int a[maxn];
struct E
{
	int l,r;
	int val;
	int add;int mul=1;//乘法初始化
}num[maxn];
void build(int l,int r,int node)//建树
{
   num[node].l=l;num[node].r=r;num[node].val=0;
   if(l==r){num[node].val=a[l];return;}
   int m=(l+r)>>1;
   build(l,m,node*2);
   build(m+1,r,node*2+1);
   num[node].val=num[node*2].val+num[node*2+1].val;
}
void pushdown(int node)//左右分别下传标记以及值
{
	num[node*2].val=(num[node*2].val*num[node].mul%mod+num[node].add*(num[node*2].r-num[node*2].l+1)%mod)%mod;
	num[node*2].mul*=num[node].mul%mod;
	num[node*2].add=(num[node*2].add*num[node].mul%mod+num[node].add)%mod;
	num[node*2+1].val=(num[node*2+1].val*num[node].mul%mod+num[node].add*(num[node*2+1].r-num[node*2+1].l+1)%mod)%mod;
	num[node*2+1].mul*=num[node].mul%mod;
	num[node*2+1].add=(num[node*2+1].add*num[node].mul%mod+num[node].add)%mod;
	num[node].mul=1,num[node].add=0;
}
void modify2(int q,int w,int x,int node)//乘法
{
	int l=num[node].l,r=num[node].r;
	if(q<=l&&w>=r)
	{
		num[node].val=num[node].val*x%mod;
		num[node].mul*=x%mod;
		num[node].add*=x%mod;
		return;
	}
	int m=(l+r)>>1;
	 pushdown(node);
	if(q<=m){modify2(q,w,x,node*2);}
	if(w>m){modify2(q,w,x,node*2+1);}
	 num[node].val=(num[node*2].val+num[node*2+1].val)%mod;
}
void modify(int q,int w,int x,int node)//加法
{
	int l=num[node].l,r=num[node].r;
	if(q<=l&&w>=r)
	{
		num[node].val+=x*(r-l+1)%mod;
		num[node].add+=x%mod;
		return;
	}
	int m=(l+r)>>1;
    pushdown(node);
	if(q<=m){modify(q,w,x,node*2);}
	if(w>m){modify(q,w,x,node*2+1);}
	 num[node].val=(num[node*2].val+num[node*2+1].val)%mod;
}
int query(int q,int w,int node)//求和
{
  int l=num[node].l;int r=num[node].r;
  if(l>=q&&r<=w){return num[node].val%mod;}
  int m=(l+r)>>1;
  int sum=0; 
  pushdown(node);
  if(q<=m){sum+=query(q,w,node*2)%mod;}
  if(w>m){sum+=query(q,w,node*2+1)%mod;}
  return sum%mod;
}
signed main()
{
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,n,1);
	while(m--)
	{
		cin>>opt;
		if(opt==2)
		{
           cin>>l2>>r2>>z;
		   modify(l2,r2,z,1);
		}
		else if(opt==3)
		{
			cin>>l2>>r2;
			cout<<query(l2,r2,1)%mod<<endl;
		}
		else if(opt==1)
		{
			cin>>l2>>r2>>z;
			modify2(l2,r2,z,1);
		}
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...