社区讨论
蒟蒻求救
P3373【模板】线段树 2参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yux8j
- 此快照首次捕获于
- 2025/11/21 05:51 4 个月前
- 此快照最后确认于
- 2025/11/21 05:51 4 个月前
样例过了,测试点全部wa。
重点是把下面的print注释去掉输出的就是正解。
救救孩子吧!
CPP#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
struct Node
{
int l,r;
long long lazyadd,lazymul,val;
}node[MAX<<2];
long long d[MAX],p;
inline void pushup(int rt)
{
node[rt].val=(node[rt<<1].val+node[rt<<1|1].val)%p;
}
inline void construct(int rt,int l,int r)
{
node[rt].l=l;
node[rt].r=r;
node[rt].lazyadd=node[rt].val=0;
node[rt].lazymul=1;
if(l==r)
{
node[rt].val=d[l];
return;
}
int mid=(l+r)>>1;
construct(rt<<1,l,mid);
construct(rt<<1|1,mid+1,r);
pushup(rt);
}
inline void pushdown(int rt)
{
if(node[rt].lazymul!=1)
{
node[rt<<1].val=(node[rt<<1].val%p)*(node[rt].lazymul%p)%p;
node[rt<<1|1].val=(node[rt<<1|1].val%p)*(node[rt].lazymul%p)%p;
node[rt<<1].lazymul=(node[rt<<1].lazymul%p)*(node[rt].lazymul%p)%p;
node[rt<<1|1].lazymul=(node[rt<<1|1].lazymul%p)*(node[rt].lazymul%p)%p;
node[rt].lazymul=1;
}
if(node[rt].lazyadd)
{
node[rt<<1].val+=(node[rt<<1].r-node[rt<<1].l+1)*node[rt].lazyadd;
node[rt<<1|1].val+=(node[rt<<1|1].r-node[rt<<1|1].l+1)*node[rt].lazyadd;
node[rt<<1].lazyadd+=node[rt].lazyadd;
node[rt<<1|1].lazyadd+=node[rt].lazyadd;
node[rt].lazyadd=0;
}
}
inline void modify(int rt,int fr,int to,long long v)
{
if(fr<=node[rt].l&&to>=node[rt].r)
{
node[rt].lazyadd+=v;
node[rt].val+=v*(node[rt].r-node[rt].l+1);
return;
}
int mid=(node[rt].l+node[rt].r)>>1;
pushdown(rt);
if(fr<=mid) modify(rt<<1,fr,to,v);
if(to>mid) modify(rt<<1|1,fr,to,v);
pushup(rt);
}
inline void modify2(int rt,int fr,int to,long long v)
{
if(fr<=node[rt].l&&to>=node[rt].r)
{
node[rt].lazymul=(node[rt].lazymul*v)%p;
node[rt].val=(v*node[rt].val)%p;
return;
}
int mid=(node[rt].l+node[rt].r)>>1;
pushdown(rt);
if(fr<=mid) modify2(rt<<1,fr,to,v);
if(to>mid) modify2(rt<<1|1,fr,to,v);
pushup(rt);
}
inline long long query(int rt,int fr,int to,int l,int r)
{
if(fr<=l&&to>=r)
return node[rt].val%p;
pushdown(rt);
int mid=(l+r)>>1;
long long ans=0;
if(fr<=mid) ans+=query(rt<<1,fr,to,l,mid);
if(to>mid) ans+=query(rt<<1|1,fr,to,mid+1,r);
return ans;
}
long long n;
inline void print()
{
for(int i=1;i<=n;++i)
{
for(int j=1;i+j<=n;j++)
printf("%lld ",query(1,i,i+j,1,n)%p);
puts(" ");
}
puts(" ");
}
int main()
{
//freopen("testin.txt","r",stdin);
//freopen("testout.txt","w",stdout);
long long m,a,b,c,k;
scanf("%lld%lld%lld",&n,&m,&p);
for(register int i=1;i<=n;++i)
scanf("%lld",&d[i]),d[i]%=p;
construct(1,1,n);
for(register int i=1;i<=m;++i)
{
scanf("%lld%lld%lld",&a,&b,&c);
if(a==2)
{
scanf("%lld",&k);
modify(1,b,c,k%p);
//print();
}
else if(a==1)
{
scanf("%lld",&k);
modify2(1,b,c,k%p);
//print();
}
else //printf("ans %lld\n\n",query(1,b,c,1,n)%p),print();
printf("%lld\n",query(1,b,c,1,n)%p);
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...