社区讨论
萌新初学 条理清晰 阳寿已折 30分求助
P3373【模板】线段树 2参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo98u85y
- 此快照首次捕获于
- 2023/10/28 07:27 2 年前
- 此快照最后确认于
- 2023/10/28 07:27 2 年前
C
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;//10倍
#define int long long//long long
int mod;
int n,m;int opt;int l2,r2,z;int a[maxn];
struct E
{
int l,r;
int val;
int add;int mul=1;//乘法初始化
}num[maxn];
void build(int l,int r,int node)//建树
{
num[node].l=l;num[node].r=r;num[node].val=0;
if(l==r){num[node].val=a[l];return;}
int m=(l+r)>>1;
build(l,m,node*2);
build(m+1,r,node*2+1);
num[node].val=num[node*2].val+num[node*2+1].val;
}
void pushdown(int node)//左右分别下传标记以及值
{
num[node*2].val=(num[node*2].val*num[node].mul%mod+num[node].add*(num[node*2].r-num[node*2].l+1)%mod)%mod;
num[node*2].mul*=num[node].mul%mod;
num[node*2].add=(num[node*2].add*num[node].mul%mod+num[node].add)%mod;
num[node*2+1].val=(num[node*2+1].val*num[node].mul%mod+num[node].add*(num[node*2+1].r-num[node*2+1].l+1)%mod)%mod;
num[node*2+1].mul*=num[node].mul%mod;
num[node*2+1].add=(num[node*2+1].add*num[node].mul%mod+num[node].add)%mod;
num[node].mul=1,num[node].add=0;
}
void modify2(int q,int w,int x,int node)//乘法
{
int l=num[node].l,r=num[node].r;
if(q<=l&&w>=r)
{
num[node].val=num[node].val*x%mod;
num[node].mul*=x%mod;
num[node].add*=x%mod;
return;
}
int m=(l+r)>>1;
pushdown(node);
if(q<=m){modify2(q,w,x,node*2);}
if(w>m){modify2(q,w,x,node*2+1);}
num[node].val=(num[node*2].val+num[node*2+1].val)%mod;
}
void modify(int q,int w,int x,int node)//加法
{
int l=num[node].l,r=num[node].r;
if(q<=l&&w>=r)
{
num[node].val+=x*(r-l+1)%mod;
num[node].add+=x%mod;
return;
}
int m=(l+r)>>1;
pushdown(node);
if(q<=m){modify(q,w,x,node*2);}
if(w>m){modify(q,w,x,node*2+1);}
num[node].val=(num[node*2].val+num[node*2+1].val)%mod;
}
int query(int q,int w,int node)//求和
{
int l=num[node].l;int r=num[node].r;
if(l>=q&&r<=w){return num[node].val%mod;}
int m=(l+r)>>1;
int sum=0;
pushdown(node);
if(q<=m){sum+=query(q,w,node*2)%mod;}
if(w>m){sum+=query(q,w,node*2+1)%mod;}
return sum%mod;
}
signed main()
{
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
while(m--)
{
cin>>opt;
if(opt==2)
{
cin>>l2>>r2>>z;
modify(l2,r2,z,1);
}
else if(opt==3)
{
cin>>l2>>r2;
cout<<query(l2,r2,1)%mod<<endl;
}
else if(opt==1)
{
cin>>l2>>r2>>z;
modify2(l2,r2,z,1);
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...