社区讨论
真不会取模,救救孩子
P3373【模板】线段树 2参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lobixwx1
- 此快照首次捕获于
- 2023/10/29 21:46 2 年前
- 此快照最后确认于
- 2023/11/04 02:52 2 年前
各位Dalao教教咋取模吧,我搁着乱%p
CPP
#include<iostream>
#include<cstdio>
#define rg register
using namespace std;
int n,m,p;
int a[100010],lazj[400040],lazc[400040]={1};
long long tr[400040];
void build(int x,int l,int r)
{
if(l==r)
{
tr[x]=a[l]; return ;
}
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
tr[x]=(tr[x<<1]+tr[x<<1|1])%p;
}
inline void pushdown(int x,int l,int r)
{
int mid=(l+r)>>1;
if(lazj[x])
{
tr[x<<1]=(tr[x<<1]+tr[x<<1]*lazc[x]+(mid-l+1)*lazj[x])%p;
tr[x<<1|1]=(tr[x<<1|1]+tr[x<<1|1]*lazc[x]+(r-mid)*lazj[x])%p;
lazj[x<<1]=lazj[x<<1]*lazc[x]+lazj[x]; lazc[x<<1]*=lazc[x];
lazj[x<<1|1]=lazj[x<<1|1]*lazc[x]+lazj[x]; lazc[x<<1|1]*=lazc[x];
lazj[x]=0; lazc[x]=1;
}
}
void modify(int x,int l,int r,int ll,int rr,int kc,int kj)
{
if(ll<=l&&r<=rr)
{
tr[x]=(tr[x]*kc+(r-l+1)*kj)%p;
lazj[x]=lazj[x]*kc+kj; lazc[x]*=kc;
return ;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(ll<=mid) modify(x<<1,l,mid,ll,rr,kc,kj);
if(rr>mid) modify(x<<1|1,mid+1,r,ll,rr,kc,kj);
tr[x]=tr[x<<1]+tr[x<<1|1];
}
long long query(int x,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr) return tr[x];
pushdown(x,l,r);
int mid=(l+r)>>1; long long sum=0;
if(ll<=mid) sum=(sum+query(x<<1,l,mid,ll,rr))%p;
if(rr>mid) sum=(sum+query(x<<1|1,mid+1,r,ll,rr))%p;
return sum;
}
int main()
{
cin>>n>>m>>p;
for(rg int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
for(rg int i=1;i<=m;i++)
{
int f,x,y; scanf("%d %d %d",&f,&x,&y);
if(f==1)//*
{
int k; scanf("%d",&k);
modify(1,1,n,x,y,k,0);
}
if(f==2)//+
{
int k; scanf("%d",&k);
modify(1,1,n,x,y,1,k);
}
if(f==3)
{
printf("%lld\n",query(1,1,n,x,y));
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...