社区讨论

#2#9#10 WA多次求教!

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

讨论操作

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

当前回复
8 条
当前快照
1 份
快照标识符
@mi6uaxd5
此快照首次捕获于
2025/11/20 10:56
4 个月前
此快照最后确认于
2025/11/20 10:56
4 个月前
查看原帖
rt.
CPP
#include<bits/stdc++.h>
using namespace std;
long long mod,n,m,a[100002],f,x,y,k;
struct tree
{
	long long l,r,v,ad,ti;
}t[400002];
void found(long long p,long long l,long long r)
{
	t[p].l=l;
	t[p].r=r;
	t[p].ad=0;
	t[p].ti=1;
	if(t[p].l==t[p].r)
	{
		t[p].v=a[l];
		return;
	}
	long long m=(l+r)/2;
	found(2*p,l,m);
	found(2*p+1,m+1,r);
	t[p].v=(t[2*p].v+t[2*p+1].v)%mod;
	return;
}
inline void push(long long p)
{
	if(t[p].ad==0&&t[p].ti==0)
		return;
	if(t[p].l==t[p].r)
	{
		t[p].ad=0;
		t[p].ti=0;
		return;
	}
	t[2*p].v=(t[2*p].v*t[p].ti+(t[2*p].r-t[2*p].l+1)*t[p].ad)%mod;
	t[2*p].ti=(t[2*p].ti*t[p].ti)%mod;
	t[2*p].ad=(t[2*p].ad*t[p].ti+t[p].ad)%mod;
	t[2*p+1].v=(t[2*p+1].v*t[p].ti+(t[2*p+1].r-t[2*p+1].l+1)*t[p].ad)%mod;
	t[2*p+1].ti=(t[2*p+1].ti*t[p].ti)%mod;
	t[2*p+1].ad=(t[2*p+1].ad*t[p].ti+t[p].ad)%mod;
	t[p].ti=1;
	t[p].ad=0;
	return;
}
void add(long long p,long long l,long long r,long long w)
{
	if(l<=t[p].l&&r>=t[p].r)
	{
		t[p].v=(t[p].v+(t[p].r-t[p].l+1)*w)%mod;
		t[p].ad=(t[p].ad+w)%mod;
		return;
	}
	push(p);
	if(l<=t[2*p].r)
		add(2*p,l,r,w);
	if(r>=t[2*p+1].l)
		add(2*p+1,l,r,w);
	t[p].v=(t[2*p].v+t[2*p+1].v)%mod;
	return;
}
void times(long long p,long long l,long long r,long long w)
{
	if(l<=t[p].l&&r>=t[p].r)
	{
		t[p].v=(t[p].v*w)%mod;
		t[p].ad=(t[p].ad*w)%mod;
		t[p].ti=(t[p].ti*w)%mod;
		return;
	}
	push(p);
	if(l<=t[2*p].r)
		times(2*p,l,r,w);
	if(r>=t[2*p+1].l)
		times(2*p+1,l,r,w);
	t[p].v=(t[2*p].v+t[2*p+1].v)%mod;
	return;
}
long long sum(long long p,long long l,long long r)
{
	if(l<=t[p].l&&r>=t[p].r)
		return t[p].v;
	push(p);
	long long val=0;
	if(l<=t[2*p].r)
		val=(val+sum(2*p,l,r))%mod;
	if(r>=t[2*p+1].l)
		val=(val+sum(2*p+1,l,r))%mod;
	return val;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(long long  i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	found(1,1,n);
	while(m--)
	{
		scanf("%lld",&f);
		if(f==1)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			times(1,x,y,k);
		}
		if(f==2)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			add(1,x,y,k);
		}
		else if(f==3)
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",sum(1,x,y)%mod);
		}
	}
	return 0;
}

回复

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

正在加载回复...