社区讨论
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 条回复,欢迎继续交流。
正在加载回复...