社区讨论

蒟蒻求救

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi7yux8j
此快照首次捕获于
2025/11/21 05:51
4 个月前
此快照最后确认于
2025/11/21 05:51
4 个月前
查看原帖
样例过了,测试点全部wa。 重点是把下面的print注释去掉输出的就是正解。 救救孩子吧!
CPP
#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
struct Node
{
	int l,r;
	long long lazyadd,lazymul,val;
}node[MAX<<2];
long long d[MAX],p;
inline void pushup(int rt)
{
	node[rt].val=(node[rt<<1].val+node[rt<<1|1].val)%p;
}
inline void construct(int rt,int l,int r)
{
	node[rt].l=l;
	node[rt].r=r;
	node[rt].lazyadd=node[rt].val=0;
	node[rt].lazymul=1;
	if(l==r)
	{
		node[rt].val=d[l];
		return;
	}
	int mid=(l+r)>>1;
	construct(rt<<1,l,mid);
	construct(rt<<1|1,mid+1,r);
	pushup(rt);
}
inline void pushdown(int rt)
{
	if(node[rt].lazymul!=1)
	{
		node[rt<<1].val=(node[rt<<1].val%p)*(node[rt].lazymul%p)%p;
		node[rt<<1|1].val=(node[rt<<1|1].val%p)*(node[rt].lazymul%p)%p;
		node[rt<<1].lazymul=(node[rt<<1].lazymul%p)*(node[rt].lazymul%p)%p;
		node[rt<<1|1].lazymul=(node[rt<<1|1].lazymul%p)*(node[rt].lazymul%p)%p;
		node[rt].lazymul=1;
	}
	if(node[rt].lazyadd)
	{
		node[rt<<1].val+=(node[rt<<1].r-node[rt<<1].l+1)*node[rt].lazyadd;
		node[rt<<1|1].val+=(node[rt<<1|1].r-node[rt<<1|1].l+1)*node[rt].lazyadd;
		node[rt<<1].lazyadd+=node[rt].lazyadd;
		node[rt<<1|1].lazyadd+=node[rt].lazyadd;
		node[rt].lazyadd=0;
	}
}
inline void modify(int rt,int fr,int to,long long v)
{
	if(fr<=node[rt].l&&to>=node[rt].r)
	{
		node[rt].lazyadd+=v;
		node[rt].val+=v*(node[rt].r-node[rt].l+1);
		return;
	}
	int mid=(node[rt].l+node[rt].r)>>1;
	pushdown(rt);
	if(fr<=mid)	modify(rt<<1,fr,to,v);
	if(to>mid)	modify(rt<<1|1,fr,to,v);
	pushup(rt);
}
inline void modify2(int rt,int fr,int to,long long v)
{
	if(fr<=node[rt].l&&to>=node[rt].r)
	{
		node[rt].lazymul=(node[rt].lazymul*v)%p;
		node[rt].val=(v*node[rt].val)%p;
		return;
	}
	int mid=(node[rt].l+node[rt].r)>>1;
	pushdown(rt);
	if(fr<=mid)	modify2(rt<<1,fr,to,v);
	if(to>mid)	modify2(rt<<1|1,fr,to,v);
	pushup(rt);
}
inline long long query(int rt,int fr,int to,int l,int r)
{
	if(fr<=l&&to>=r)
		return node[rt].val%p;
	pushdown(rt);
	int mid=(l+r)>>1;
	long long ans=0;
	if(fr<=mid)	ans+=query(rt<<1,fr,to,l,mid);
	if(to>mid)	ans+=query(rt<<1|1,fr,to,mid+1,r);
	return ans;
}
long long n;
inline void print()
{
	for(int i=1;i<=n;++i)
		{
			for(int j=1;i+j<=n;j++)
				printf("%lld ",query(1,i,i+j,1,n)%p);
			puts(" ");
		}
	puts(" ");
}
int main()
{
	//freopen("testin.txt","r",stdin);
	//freopen("testout.txt","w",stdout);
	long long m,a,b,c,k;
	scanf("%lld%lld%lld",&n,&m,&p);
	for(register int i=1;i<=n;++i)
		scanf("%lld",&d[i]),d[i]%=p;
	construct(1,1,n);
	for(register int i=1;i<=m;++i)
	{
		scanf("%lld%lld%lld",&a,&b,&c);
		if(a==2)
		{
			scanf("%lld",&k);
			modify(1,b,c,k%p);
			//print();
		}
		else if(a==1)
		{
			scanf("%lld",&k);
			modify2(1,b,c,k%p);
			//print();
		}
		else //printf("ans %lld\n\n",query(1,b,c,1,n)%p),print();
			printf("%lld\n",query(1,b,c,1,n)%p);
	}
	return 0;
}

回复

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

正在加载回复...