社区讨论

求助P3373 【模板】线段树 2

学术版参与者 2已保存回复 10

讨论操作

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

当前回复
10 条
当前快照
1 份
快照标识符
@lz5apju6
此快照首次捕获于
2024/07/28 16:25
2 年前
此快照最后确认于
2024/07/28 17:43
2 年前
查看原帖

代码样例过了,但提交就是WA.

感觉代码模拟的也没错,望大佬指出错误

CPP
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	register int x=0,y=1;
	register char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
 		{
			y=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*y;
}
#define lc p<<1
#define rc p<<1|1  //左移一位后最低位一定是0,或1相当于加1
#define N 100005
int n,m,mod;
int c;
int x,y,k;
int a[N];
struct q{
	long long l,r,sum,add,mu;
}t[N*4];
void pushup(int p) //向上更新
{
	t[p].sum=(t[lc].sum+t[rc].sum)%mod;
}
void build(int p,int l,int r) //建边
{
	t[p]={l,r,a[l]%mod,0,1};
	if (l==r)
	{
		return;
	}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(p);
}
void pushdown_addd(int p) //向下更新
{
	if (t[p].add)
	{
		t[lc].sum+=(t[p].add*(t[lc].r-t[lc].l+1))%mod;
		t[rc].sum+=(t[p].add*(t[rc].r-t[rc].l+1))%mod;
		t[lc].add+=t[p].add;
		t[rc].add+=t[p].add;
		t[p].add=0;
	}
}
void pushdown_muu(int p) //向下更新
{
	if (t[p].mu!=1)
	{
		t[lc].sum*=(t[p].mu)%mod;
		t[rc].sum*=(t[p].mu)%mod;
		t[lc].mu*=t[p].mu;
		t[rc].mu*=t[p].mu;
		t[p].mu=1;
	}
}
void addd(int p,int x,int y,int k)
{
	if (t[p].l>=x&&t[p].r<=y)
	{
		t[p].sum+=(t[p].r-t[p].l+1)*k;
		t[p].add+=k;
		return;
	}
	pushdown_addd(p);
	int mid=(t[p].l+t[p].r)>>1;
	if (x<=mid) addd(lc,x,y,k);
	if (y>mid) addd(rc,x,y,k);
	pushup(p);
}
void muu(int p,int x,int y,int k)
{
	if (t[p].l>=x&&t[p].r<=y)
	{
		t[p].sum*=k;
		t[p].mu*=k;
		return;
	}
	pushdown_muu(p);
	int mid=(t[p].l+t[p].r)>>1;
	if (x<=mid) muu(lc,x,y,k);
	if (y>mid) muu(rc,x,y,k);
	pushup(p);
}
long long query(int p,int x,int y)
{
	if (t[p].l>=x&&t[p].r<=y)
	{
		return t[p].sum;
	}
	int mid=(t[p].l+t[p].r)>>1;
	pushdown_addd(p);
	pushdown_muu(p);
	long long sum=0;
	if (x<=mid) sum+=query(lc,x,y);
	if (y>mid) sum+=query(rc,x,y);
	return sum;
}
int main()
{
	n=read();
	m=read();
	mod=read();
	for (int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	build (1,1,n);
	for (int i=1;i<=m;i++)
	{
 		c=read();
		if (c==1)
		{
			x=read();
			y=read();
			k=read();
			muu(1,x,y,k);
		}
		if (c==2)
		{
			x=read();
			y=read();
			k=read();
			addd(1,x,y,k);
		}
		if (c==3)
		{
			x=read();
			y=read();
			printf("%lld\n",query(1,x,y)%mod);
		}
	}
	return 0;
}

回复

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

正在加载回复...