社区讨论

WA30分,求助

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

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@mi6oekib
此快照首次捕获于
2025/11/20 08:11
4 个月前
此快照最后确认于
2025/11/20 08:27
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll w[1000000+1];
ll n,m,k1,k2,k3,k4,mark1[1000000+1],mark2[1000000+1],sum[2000000+1],p;
void wh(ll x)
{
	sum[x]=(sum[2*x+1]+sum[2*x])%p;
}
void build(ll l,ll r,ll v)
{
	mark1[v]=1;
	if(l==r)
	{
		sum[v]=w[l]%p;
		return;
	}
	ll mid=(l+r)/2;
	build(l,mid,2*v);
	build(mid+1,r,2*v+1);
	wh(v);
}
void pushdown(ll x,ll lr,ll rr)
{
	if(mark1[x]!=1&&mark1[x]!=0)
	{
		sum[2*x]=(mark1[x]*sum[2*x])%p;
		sum[2*x+1]=(mark1[x]*sum[2*x+1])%p;
		mark1[2*x]=(mark1[x]*mark1[2*x])%p;
		mark1[2*x+1]=(mark1[x]*mark1[2*x+1])%p;
		mark2[2*x]=(mark1[x]*mark2[2*x])%p;
		mark2[2*x+1]=(mark1[x]*mark2[2*x+1])%p; 
		mark1[x]=1;
	}
	if(mark2[x]!=0)
	{
		sum[2*x]=(mark2[x]*lr+sum[2*x])%p;
		sum[2*x+1]=(mark2[x]*rr+sum[2*x+1])%p;;
		mark2[2*x]=(mark2[x]+mark2[2*x])%p;
		mark2[2*x+1]=(mark2[x]+mark2[2*x+1])%p;
		mark2[x]=0;
	}
}
void push1(ll l,ll r,ll v,ll L,ll R,ll C)
{
	if(l>=L&&r<=R)
	{
		sum[v]=(C*sum[v])%p;
		mark1[v]=(C*mark1[v])%p;
		mark2[v]=(C*mark2[v])%p;
		return;
	}
	ll mid=(l+r)/2;
	pushdown(v,mid-l+1,r-mid);
	if(L<=mid)
	{
		push1(l,mid,2*v,L,R,C);
	}
	if(R>=mid+1)
	{
		push1(mid+1,r,2*v+1,L,R,C);
	}
	wh(v);
}
void push2(ll l,ll r,ll v,ll L,ll R,ll C)
{
	if(l>=L&&r<=R)
	{
		sum[v]=(sum[v]+C*(r-l+1))%p;
		mark2[v]=(C+mark2[v])%p;
		return;
	}
	ll mid=(l+r)/2;
	pushdown(v,mid-l+1,r-mid);
	if(L<=mid)
	{
		push2(l,mid,2*v,L,R,C);
	}
	if(R>=mid+1)
	{
		push2(mid+1,r,2*v+1,L,R,C);
	}
	wh(v);
}
ll query(ll l,ll r,ll v,ll L,ll R)
{
	if(l>=L&&r<=R)
	{
		return sum[v]%p;
	}
	ll ans=0;
	ll mid=(l+r)/2;
	pushdown(v,mid-l+1,r-mid);
	if(L<=mid)
	{
		ans=(query(l,mid,2*v,L,R)+ans)%p;
	}
	if(R>=mid+1)
	{
		ans=(query(mid+1,r,2*v+1,L,R)+ans)%p;
	}
	return ans;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m>>p;
	for(ll i=1;i<=n;i++)
	{
		cin>>w[i];
		w[i]=w[i]%p;
	}
	build(1,n,1);
	for(ll i=1;i<=m;i++)
	{
		cin>>k1;
		if(k1==1)
		{
			cin>>k2>>k3>>k4;
			k4=k4%p;
			push1(1,n,1,k2,k3,k4);
		}
		else if(k1==2)
		{
			cin>>k2>>k3>>k4;
			k4=k4%p;
			push2(1,n,1,k2,k3,k4);
		}
		else
		{
			cin>>k2>>k3;
			cout<<query(1,n,1,k2,k3)<<endl;
		}
	}
	return 0;
}

回复

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

正在加载回复...