社区讨论
WA on #2 #9 #10,求调,人快疯了!
P3372【模板】线段树 1参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lzuxittr
- 此快照首次捕获于
- 2024/08/15 14:58 2 年前
- 此快照最后确认于
- 2024/08/15 17:02 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[100010],d[401010],m,tag[400010],tag1[400010],op,u,v,w,mod;
void pushdown(int cur,int l,int r)
{
if(tag[cur]>1||tag1[cur])
{
int mid=(l+r)>>1;
tag[cur*2]=(tag[cur*2]*tag[cur])%mod;
tag[cur*2+1]=(tag[cur*2+1]*tag[cur])%mod;
tag1[cur*2]=(tag1[cur*2]*tag[cur])%mod;
tag1[cur*2+1]=(tag1[cur*2+1]*tag[cur])%mod;
tag1[cur*2]=(tag1[cur*2]+tag1[cur])%mod;
tag1[cur*2+1]=(tag1[cur*2+1]+tag1[cur])%mod;
d[cur*2]=(d[cur*2]*tag[cur])%mod;
d[cur*2+1]=(d[cur*2+1]*tag[cur])%mod;
d[cur*2]=(d[cur*2]+tag1[cur]*(mid-l+1))%mod;
d[cur*2+1]=(d[cur*2+1]+tag1[cur]*(r-mid))%mod;
tag1[cur]=0;
tag[cur]=1;
}
}
void build(int s,int t,int p)
{
if (s==t)
{
d[p]=a[s];
return;
}
int mid=(t+s)>>1;
build(s,mid,p*2);
build(mid+1,t,p*2+1);
d[p]=(d[p*2]+d[p*2+1])%mod;
}
int query(int l,int r,int s,int t,int p)
{
if (l<=s && t<=r)
return d[p];
int mid=(t+s)>>1,sum=0;
pushdown(p,s,t);
if (l<=mid)sum=(sum+query(l,r,s,mid,p*2))%mod;
if (r>mid)sum=(sum+query(l,r,mid+1,t,p*2+1))%mod;
return sum%mod;
}
void Modify1(int l,int r,int s,int t,int p,int sum)
{
int mid=(t+s)>>1;
if(l<=s&&t<=r)
{
tag1[p]=(tag1[p]*sum)%mod;
tag[p]=(tag[p]*sum)%mod;
d[p]=(d[p]*sum)%mod;
return;
}
pushdown(p,s,t);
if (l<=mid)Modify1(l,r,s,mid,p*2,sum);
if (r>mid)Modify1(l,r,mid+1,t,p*2+1,sum);
d[p]=(d[p*2]+d[p*2+1])%mod;
}
void Modify2(int l,int r,int s,int t,int p,int sum)
{
int mid=(t+s)>>1;
if(l<=s&&t<=r)
{
tag1[p]=(tag1[p]+sum)%mod;
d[p]=(d[p]+sum*(t-s+1))%mod;
return;
}
pushdown(p,s,t);
if (l<=mid)Modify2(l,r,s,mid,p*2,sum);
if (r>mid)Modify2(l,r,mid+1,t,p*2+1,sum);
d[p]=(d[p*2]+d[p*2+1])%mod;
}
signed main()
{
cin>>n>>m>>mod;
for(int i=1;i<=4*n;i++)tag[i]=1;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;i++)
{
//for(int i=1;i<=n;i++)cout<<d[i]<<" ";
//cout<<endl;
cin>>op>>u>>v;
if(op==1)
{
cin>>w;
Modify1(u,v,1,n,1,w);
}
else
if(op==2)
{
cin>>w;
Modify2(u,v,1,n,1,w);
//for(int i=1;i<=n;i++)cout<<d[i]<<" ";
//cout<<endl;
}
else
if(op==3)
{
cout<<query(u,v,1,n,1)%mod<<endl;
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...