关于爆0
查看原帖
关于爆0
735696
Mcqueen1210楼主2024/9/19 16:35

似乎与题解首页没有大区别,望各位大佬讲解

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M=1e5+5;
ll n,q,mod,a[M<<2],t[M<<2];
ll add[M<<2],mul[M<<2];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
ll mim(ll pl,ll pr){return (pl+pr)>>1;}
void push_up(ll p)
{
	t[p]=t[ls(p)]+t[rs(p)];
}
void build(ll p,ll pl,ll pr)
{
	add[p]=0,mul[p]=1;
	if(pl==pr)
	{
		t[p]=a[pl];
	}
	else
	{
		ll mid=mim(pl,pr);
		build(ls(p),pl,mid);
		build(rs(p),mid+1,pr);
		push_up(p);
	}
}
void multag(ll p,ll k)
{
	a[p]=(a[p]*k)%mod;
    mul[p]=(mul[p]*k)%mod;
    add[p]=(add[p]*k)%mod;
}
void addtag(ll p,ll pl,ll pr,ll k)
{
	a[p]=(a[p]+k*(pr-pl+1))%mod;
    add[p]=(add[p]+k)%mod;
}
void push_down(ll p,ll pl,ll pr)
{
	ll mid=mim(pl,pr),l=ls(p),r=rs(p);
	a[l]=(a[l]*mul[p]+add[p]*(mid-l+1))%mod;
	a[r]=(a[r]*mul[p]+add[p]*(r-mid))%mod;
	mul[l]=(mul[l]*mul[p])%mod;
	mul[r]=(mul[r]*mul[p])%mod;
	add[l]=(add[l]*mul[p]+add[p])%mod;
	add[r]=(add[r]*mul[p]+add[p])%mod;
	add[p]=0,mul[p]=1;
}
//update mul 
void um(ll p,ll pl,ll pr,ll l,ll r,ll k)
{
	if(l<=pl&&pr<=r)
	{
		multag(p,k);
	}
	else
	{
		push_down(p,pl,pr);
		ll mid=mim(pl,pr);
		if(l<=mid) um(ls(p),pl,mid,l,r,k);
		if(r>mid) um(rs(p),mid+1,pr,l,r,k);
		push_up(p); 
	}
}
//update add 
void ua(ll p,ll pl,ll pr,ll l,ll r,ll k)
{
	if(l<=pl&&pr<=r)
	{
		addtag(p,pl,pr,k);
	}
	else
	{
		push_down(p,pl,pr);
		ll mid=mim(pl,pr);
		if(l<=mid) ua(ls(p),pl,mid,l,r,k);
		if(r>mid) ua(rs(p),mid+1,pr,l,r,k);
		push_up(p); 
	}
}
ll sum(ll p,ll pl,ll pr,ll l,ll r)
{
	if(l<=pl&&pr<=r)
	{
		return t[p];
	}
	else
	{
		push_down(p,pl,pr);
		ll ans=0;
		ll mid=mim(pl,pr);
		if(l<=mid) ans+=sum(ls(p),pl,mid,l,r);
		if(r>mid) ans+=sum(rs(p),mid+1,pr,l,r);
		return ans;
	}
}
int main()
{
	cin>>n>>q>>mod;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	while(q--)
	{
		ll op,x,y,k;
		cin>>op>>x>>y;
		if(op==1)
		{
			cin>>k;
			um(1,1,n,x,y,k);
		}
		else if(op==2)
		{
			cin>>k;
			ua(1,1,n,x,y,k);
		}
		else
		{
			cout<<sum(1,1,n,x,y)<<endl;
		}
	}
	return 0;
}
2024/9/19 16:35
加载中...