社区讨论

大佬求解哪里写错了……

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mi7rsco6
此快照首次捕获于
2025/11/21 02:33
4 个月前
此快照最后确认于
2025/11/21 02:33
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<sstream>
#include<cctype>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<ctime>
#define ll long long
#define ull unsigned long long
#define ff first
#define ss second
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int INF=2147483647;
inline ll read()
{
	ll x=0,k=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*k;
}
struct node
{
	ll v,lazm,lazp;
}tree[400386];
ll a[100086],n,m,p,x,y,k,op;
void update(ll root)
{
	tree[root].v=(tree[root<<1].v+tree[root<<1|1].v)%p;
}
void build(ll l,ll r,ll root)
{
	tree[root].lazm=1,tree[root].lazp=0;
	if(l==r)
	{
		tree[root].v=a[l]%p;
		return ;
	}
	ll mid=(l+r)>>1;
	build(l,mid,root<<1);
	build(mid+1,r,root<<1|1);
	update(root);
}
void pushdown(ll root,ll l,ll r)
{
	ll mid=(l+r)>>1;
	tree[root<<1].v=(tree[root<<1].v*tree[root].lazm+(mid-l+1)*tree[root].lazp)%p;
	tree[root<<1|1].v=(tree[root<<1|1].v*tree[root].lazm+(r-mid)*tree[root].lazp)%p;
	tree[root<<1].lazm=(tree[root<<1].lazm*tree[root].lazm)%p;
	tree[root<<1|1].lazm=(tree[root<<1|1].lazm*tree[root].lazm)%p;
	tree[root<<1].lazp=(tree[root<<1].lazp*tree[root].lazm+tree[root].lazp)%p;
	tree[root<<1|1].lazp=(tree[root<<1|1].lazp*tree[root].lazm+tree[root].lazp)%p;
	tree[root].lazp=0,tree[root].lazm=1;
}
void mul(ll l,ll r,ll lnow,ll rnow,ll x,ll root)
{
	if(r<lnow||l>rnow)return ;
	if(l<=lnow&&r>=rnow)
	{
		tree[root].v=(tree[root].v*x)%p;
		tree[root].lazm=(tree[root].lazm*x)%p;
		tree[root].lazp=(tree[root].lazp*x)%p;
		return ;
	}
	pushdown(root,lnow,rnow);
	ll mid=(lnow+rnow)>>1;
	if(r<=mid)mul(l,r,lnow,mid,x,root<<1);
	if(r>mid)mul(l,r,mid+1,rnow,x,root<<1|1);
	update(root);
}
void add(ll l,ll r,ll lnow,ll rnow,ll x,ll root)
{
	if(r<lnow||l>rnow)return ;
	if(l<=lnow&&r>=rnow)
	{
		tree[root].v=(tree[root].v+(rnow-lnow+1)*x)%p;
		tree[root].lazp=(tree[root].lazp+x)%p;
		return ;
	}
	pushdown(root,lnow,rnow);
	ll mid=(lnow+rnow)>>1;
	if(r<=mid)mul(l,r,lnow,mid,x,root<<1);
	if(r>mid)mul(l,r,mid+1,rnow,x,root<<1|1);
	update(root);
}
ll query(ll l,ll r,ll lnow,ll rnow,ll root)
{
	if(l<=lnow&&r>=rnow)return tree[root].v;
	pushdown(root,lnow,rnow);
	ll mid=(lnow+rnow)>>1,ans=0;
	if(r<=mid)ans+=query(l,r,lnow,mid,root<<1);
	if(r>mid)ans+=query(l,r,mid+1,rnow,root<<1|1);
	return ans;
}
int main()
{
	n=read(),m=read(),p=read();
	rep(i,1,n)a[i]=read();
	build(1,n,1);
	while(m--)
	{
		op=read(),x=read(),y=read();
		if(op==1)
		{
			k=read();
			mul(x,y,1,n,k,1);
		}
		else if(op==2)
		{
			k=read();
			add(x,y,1,n,k,1);
		}
		else
		{
			ll t=query(x,y,1,n,1);
			printf("%lld\n",t);
		}
	}
	return 0;
}
可能很显然的错误然而本蒟蒻眼瞎没看见……

回复

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

正在加载回复...