社区讨论
成功疯掉了。。。
P3373【模板】线段树 2参与者 4已保存回复 12
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 12 条
- 当前快照
- 1 份
- 快照标识符
- @mi7pqbiy
- 此快照首次捕获于
- 2025/11/21 01:36 4 个月前
- 此快照最后确认于
- 2025/11/21 01:53 4 个月前
大佬看看哪里错了。。。
CPP#include<bits/stdc++.h>
using namespace std;
const long long MAXN=1000001;
long long n,m,x,y,c,opt,ans,p;
struct TREE
{
long long l;
long long r;
long long w;
long long jia;
long long cheng;
}tree[MAXN*4];
void down(long long k)
{
tree[k*2].jia=(tree[k*2].jia*tree[k].cheng+tree[k].jia)%p;
tree[k*2+1].jia=(tree[k*2+1].jia*tree[k].cheng+tree[k].jia)%p;
tree[k*2].cheng=(tree[k*2].cheng*tree[k].cheng)%p;
tree[k*2+1].cheng=(tree[k*2+1].cheng*tree[k].cheng)%p;
tree[k*2].w=(tree[k*2].w*tree[k].cheng+tree[k].jia*(tree[k].r-tree[k].l+1))%p;
tree[k*2+1].w=(tree[k*2+1].w*tree[k].cheng+tree[k].jia*(tree[k].r-tree[k].l+1))%p;
tree[k].jia=0;
tree[k].cheng=1;
}
void build(long long l,long long r,long long k)
{
tree[k].l=l;tree[k].r=r;
tree[k].cheng=1;
if(l==r)
{
cin>>tree[k].w;
return;
}
long long mid=(l+r)/2;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
void manychan(long long x,long long y,long long w,long long k)
{
if(tree[k].l>=x&&tree[k].r<=y)
{
tree[k].w=(tree[k].w+(tree[k].r-tree[k].l+1)*w)%p;
tree[k].jia=(tree[k].jia+w)%p;
return;
}
if(tree[k].jia) down(k);
long long mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) manychan(x,y,w,k*2);
if(y>mid) manychan(x,y,w,k*2+1);
tree[k].w=(tree[k*2].w+tree[k*2+1].w)%p;
}
void manycheng(int x,int y,int a,int k)
{
if(tree[k].l>=x&&tree[k].r<=y)
{
tree[k].w=(tree[k].w*a)%p;
tree[k].jia=(tree[k].jia*a)%p;
tree[k].cheng=(tree[k].cheng*a)%p;
return;
}
if(tree[k].jia||tree[k].cheng) down(k);
long long mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) manycheng(x,y,a,k*2);
if(y>mid) manycheng(x,y,a,k*2+1);
tree[k].w=(tree[k*2].w+tree[k*2+1].w)%p;
}
void sum(long long x,long long y,long long k)
{
if(tree[k].l>=x&&tree[k].r<=y)
{
ans=(ans+tree[k].w)%p;
return;
}
if(tree[k].jia) down(k);
long long mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) sum(x,y,k*2);
if(y>mid) sum(x,y,k*2+1);
}
int main()
{
cin>>n>>m>>p;
build(1,n,1);
for(long long i=1;i<=m;i++)
{
cin>>opt;
if(opt==1)
{
cin>>x>>y>>c;
manycheng(x,y,c,1);
}
if(opt==2)
{
cin>>x>>y>>c;
manychan(x,y,c,1);
}
if(opt==3)
{
cin>>x>>y;
ans=0;
sum(x,y,1);
cout<<ans<<endl;
}
}
return 0;
}
回复
共 12 条回复,欢迎继续交流。
正在加载回复...