社区讨论

30pts 只对了#1#3#4 求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjt884t
此快照首次捕获于
2025/11/04 08:07
4 个月前
此快照最后确认于
2025/11/04 08:07
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
	int l,r;
	int w,lazy1,lazy2;
} tree[400010];
int n,q,mod;
void build(int l,int r,int k)
{
	tree[k].l=l;tree[k].r=r;
	tree[k].lazy1=1;tree[k].lazy2=0;
	if(l==r)
	{
		cin>>tree[k].w;
		tree[k].w%=mod;
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,2*k);build(mid+1,r,2*k+1);
	tree[k].w=(tree[2*k].w+tree[2*k+1].w)%mod;
	return ;
}
void pushdown(int k)
{
	tree[2*k].w=(tree[2*k].w*tree[k].lazy1%mod+tree[k].lazy2*(tree[2*k].r-tree[2*k].l+1)%mod)%mod;
	tree[2*k+1].w=(tree[2*k+1].w*tree[k].lazy1%mod+tree[k].lazy2*(tree[2*k+1].r-tree[2*k+1].l+1)%mod)%mod;
	tree[2*k].lazy1=(tree[2*k].lazy1*tree[k].lazy1)%mod;
	tree[2*k+1].lazy1=(tree[2*k+1].lazy1*tree[k+1].lazy1)%mod;
	tree[2*k].lazy2=(tree[2*k].lazy2*tree[k].lazy1%mod+tree[k].lazy2)%mod;
	tree[2*k+1].lazy2=(tree[2*k+1].lazy2*tree[k].lazy1%mod+tree[k].lazy2)%mod;
	tree[k].lazy1=1;tree[k].lazy2=0;
	return ;
}
void update1(int l,int r,int k,int c)
{
	if(l<=tree[k].l&&tree[k].r<=r)
	{
		tree[k].w=(tree[k].w*c)%mod;
		tree[k].lazy1=(tree[k].lazy1*c)%mod;
		tree[k].lazy2=(tree[k].lazy2*c)%mod;
		return ;
	}
	if(tree[k].lazy1!=1||tree[k].lazy2!=0) pushdown(k);
	int mid=(tree[k].l+tree[k].r)>>1;
	if(l<=mid) update1(l,r,2*k,c);
	if(mid<r) update1(l,r,2*k+1,c);
	tree[k].w=(tree[2*k].w+tree[2*k+1].w)%mod;
	return ;
}
void update2(int l,int r,int k,int c)
{
	if(l<=tree[k].l&&tree[k].r<=r)
	{
		tree[k].w=(tree[k].w+c*(tree[k].r-tree[k].l+1)%mod)%mod;
		tree[k].lazy2=(tree[k].lazy2+c)%mod;
		return ;
	}
	if(tree[k].lazy1!=1||tree[k].lazy2!=0) pushdown(k);
	int mid=(tree[k].l+tree[k].r)>>1;
	if(l<=mid) update2(l,r,2*k,c);
	if(mid<r) update2(l,r,2*k+1,c);
	tree[k].w=(tree[2*k].w+tree[2*k+1].w)%mod;
	return ;
}
int getsum(int l,int r,int k)
{
	if(l<=tree[k].l&&tree[k].r<=r) return tree[k].w;
	if(tree[k].lazy1!=1||tree[k].lazy2!=0) pushdown(k);
	int sum=0;
	int mid=(tree[k].l+tree[k].r)>>1;
	if(l<=mid) sum=(sum+getsum(l,r,2*k))%mod;
	if(mid<r) sum=(sum+getsum(l,r,2*k+1))%mod;
	return sum;
}
signed main()
{
	cin>>n>>q>>mod;
	build(1,n,1);
	int op,l,r;
	int k;
	while(q--)
	{
		cin>>op>>l>>r;
		if(op==1)
		{
			cin>>k;
			update1(l,r,1,k);
		}
		else if(op==2)
		{
			cin>>k;
			update2(l,r,1,k);
		}
		else cout<<getsum(l,r,1)%mod<<"\n";
	}
	return 0;
}

回复

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

正在加载回复...