社区讨论

WA on #2 #9 #10,求调,人快疯了!

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lzuxittr
此快照首次捕获于
2024/08/15 14:58
2 年前
此快照最后确认于
2024/08/15 17:02
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[100010],d[401010],m,tag[400010],tag1[400010],op,u,v,w,mod;
void pushdown(int cur,int l,int r)
{
	if(tag[cur]>1||tag1[cur])
	{
		int mid=(l+r)>>1;
		tag[cur*2]=(tag[cur*2]*tag[cur])%mod;
		tag[cur*2+1]=(tag[cur*2+1]*tag[cur])%mod;
		tag1[cur*2]=(tag1[cur*2]*tag[cur])%mod;
		tag1[cur*2+1]=(tag1[cur*2+1]*tag[cur])%mod;
		tag1[cur*2]=(tag1[cur*2]+tag1[cur])%mod;
		tag1[cur*2+1]=(tag1[cur*2+1]+tag1[cur])%mod;
		d[cur*2]=(d[cur*2]*tag[cur])%mod;
		d[cur*2+1]=(d[cur*2+1]*tag[cur])%mod;
		d[cur*2]=(d[cur*2]+tag1[cur]*(mid-l+1))%mod;
		d[cur*2+1]=(d[cur*2+1]+tag1[cur]*(r-mid))%mod;
		tag1[cur]=0;
		tag[cur]=1;
	}
}
void build(int s,int t,int p)
{
    if (s==t) 
	{
        d[p]=a[s];
        return;
    }
    int mid=(t+s)>>1;
    build(s,mid,p*2);
    build(mid+1,t,p*2+1);
    d[p]=(d[p*2]+d[p*2+1])%mod;
}
int query(int l,int r,int s,int t,int p)
{
	if (l<=s && t<=r)
    return d[p];
    int mid=(t+s)>>1,sum=0;
    pushdown(p,s,t);
    if (l<=mid)sum=(sum+query(l,r,s,mid,p*2))%mod;
    if (r>mid)sum=(sum+query(l,r,mid+1,t,p*2+1))%mod;
    return sum%mod;
}
void Modify1(int l,int r,int s,int t,int p,int sum)
{
	int mid=(t+s)>>1;
	if(l<=s&&t<=r)
	{
		tag1[p]=(tag1[p]*sum)%mod;
	    tag[p]=(tag[p]*sum)%mod;
		d[p]=(d[p]*sum)%mod;
		return;
	}
	pushdown(p,s,t);
	if (l<=mid)Modify1(l,r,s,mid,p*2,sum);
    if (r>mid)Modify1(l,r,mid+1,t,p*2+1,sum);
    d[p]=(d[p*2]+d[p*2+1])%mod;
} 
void Modify2(int l,int r,int s,int t,int p,int sum)
{
	int mid=(t+s)>>1;
	if(l<=s&&t<=r)
	{
		tag1[p]=(tag1[p]+sum)%mod;
		d[p]=(d[p]+sum*(t-s+1))%mod;
		return;
	}
	pushdown(p,s,t);
	if (l<=mid)Modify2(l,r,s,mid,p*2,sum);
    if (r>mid)Modify2(l,r,mid+1,t,p*2+1,sum);
    d[p]=(d[p*2]+d[p*2+1])%mod;
} 
signed main()
{
	
	cin>>n>>m>>mod;
	for(int i=1;i<=4*n;i++)tag[i]=1;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		//for(int i=1;i<=n;i++)cout<<d[i]<<" ";
		//cout<<endl;
		cin>>op>>u>>v;
		if(op==1)
		{
			cin>>w;
			Modify1(u,v,1,n,1,w);
		}
		else
		if(op==2)
		{
			cin>>w;
			Modify2(u,v,1,n,1,w);
			//for(int i=1;i<=n;i++)cout<<d[i]<<" ";
			//cout<<endl;
		}
		else
		if(op==3)
		{
			cout<<query(u,v,1,n,1)%mod<<endl;
		}
	}
	return 0;
}

回复

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

正在加载回复...