社区讨论

help爆了

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mls68z9l
此快照首次捕获于
2026/02/18 23:13
13 小时前
此快照最后确认于
2026/02/19 12:16
2 分钟前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=1e5+5;
int n,q,m,a[N],op,x,y,k;
struct node{
	long long lt,rt,sum,tap;
}tr[4*N];

void build(int p,int l,int r)
{
	tr[p]={l,r,a[l],0};
	if(l==r)
	  return ;
	int mid=l+r>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
}
void pushdown1(int p)
{
	tr[p*2].sum+=(tr[p*2].rt-tr[p*2].lt+1)*tr[p].tap;
	tr[p*2+1].sum+=(tr[p*2+1].rt-tr[p*2+1].lt+1)*tr[p].tap;
	tr[p*2].tap+=tr[p].tap;
	tr[p*2+1].tap+=tr[p].tap;
	tr[p].tap=0;
}
void pushdown2(int p)
{
	tr[p*2].sum*=(tr[p*2].rt-tr[p*2].lt+1)*tr[p].tap;
	tr[p*2+1].sum*=(tr[p*2+1].rt-tr[p*2+1].lt+1)*tr[p].tap;
	tr[p*2].tap*=tr[p].tap;
	tr[p*2+1].tap*=tr[p].tap;
	tr[p].tap=0;
}
void add(int p,int x,int y,int k)
{
	if(x<=tr[p].lt&&tr[p].rt<=y)
	{
		tr[p].sum+=(tr[p].rt-tr[p].lt+1)*k;
		tr[p].tap+=k;
	}
	  
	pushdown1(p);
	int mid=x+y>>1; 
	if(x<=mid)
	  add(p,x,mid,k);
	if(mid<y)
	  add(p,mid+1,y,k);
	tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
} 
void times(int p,int x,int y,int k)
{
	if(x<=tr[p].lt&&tr[p].rt<=y)
	{
		tr[p].sum*=(tr[p].rt-tr[p].lt+1)*k;
		tr[p].tap*=k;
	}
	  
	pushdown2(p);
	int mid=x+y>>1; 
	if(x<=mid)
	  add(p,x,mid,k);
	if(mid<y)
	  add(p,mid+1,y,k);
	tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
} 
int query(int p,int x,int y)
{
	if(x<=tr[p].lt&&tr[p].rt<=y)
	  return tr[p].sum;
	pushdown1(p);
	int mid=x+y>>1;
    int sum=0;
	if(x<=mid)
	  sum+=query(p*2,x,y);
	if(mid<y)
	  sum+=query(p*2+1,x,y);
	  return sum;
 } 
signed main()
{
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++)
	  cin>>a[i];
	build(1,1,n);
	while(q--)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>k;
			times(1,x,y,k);
		}
		if(op==2)
		{
			cin>>x>>y>>k;
			add(1,x,y,k);
		}
		if(op==3)
		{
			cin>>x>>y;
			cout<<query(1,x,y)%m<<endl;
		}
	}
}

回复

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

正在加载回复...