社区讨论
求助P3373 【模板】线段树 2
题目总版参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lz5ang73
- 此快照首次捕获于
- 2024/07/28 16:24 2 年前
- 此快照最后确认于
- 2024/07/28 17:41 2 年前
代码样例过了,但提交就是WA.
感觉代码模拟的也没错,望大佬指出错误
CPP#include<bits/stdc++.h>
using namespace std;
inline int read()
{
register int x=0,y=1;
register char c=getchar();
while (c<'0'||c>'9')
{
if (c=='-')
{
y=-1;
}
c=getchar();
}
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*y;
}
#define lc p<<1
#define rc p<<1|1 //左移一位后最低位一定是0,或1相当于加1
#define N 100005
int n,m,mod;
int c;
int x,y,k;
int a[N];
struct q{
long long l,r,sum,add,mu;
}t[N*4];
void pushup(int p) //向上更新
{
t[p].sum=(t[lc].sum+t[rc].sum)%mod;
}
void build(int p,int l,int r) //建边
{
t[p]={l,r,a[l]%mod,0,1};
if (l==r)
{
return;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(p);
}
void pushdown_addd(int p) //向下更新
{
if (t[p].add)
{
t[lc].sum+=(t[p].add*(t[lc].r-t[lc].l+1))%mod;
t[rc].sum+=(t[p].add*(t[rc].r-t[rc].l+1))%mod;
t[lc].add+=t[p].add;
t[rc].add+=t[p].add;
t[p].add=0;
}
}
void pushdown_muu(int p) //向下更新
{
if (t[p].mu!=1)
{
t[lc].sum*=(t[p].mu)%mod;
t[rc].sum*=(t[p].mu)%mod;
t[lc].mu*=t[p].mu;
t[rc].mu*=t[p].mu;
t[p].mu=1;
}
}
void addd(int p,int x,int y,int k)
{
if (t[p].l>=x&&t[p].r<=y)
{
t[p].sum+=(t[p].r-t[p].l+1)*k;
t[p].add+=k;
return;
}
pushdown_addd(p);
int mid=(t[p].l+t[p].r)>>1;
if (x<=mid) addd(lc,x,y,k);
if (y>mid) addd(rc,x,y,k);
pushup(p);
}
void muu(int p,int x,int y,int k)
{
if (t[p].l>=x&&t[p].r<=y)
{
t[p].sum*=k;
t[p].mu*=k;
return;
}
pushdown_muu(p);
int mid=(t[p].l+t[p].r)>>1;
if (x<=mid) muu(lc,x,y,k);
if (y>mid) muu(rc,x,y,k);
pushup(p);
}
long long query(int p,int x,int y)
{
if (t[p].l>=x&&t[p].r<=y)
{
return t[p].sum;
}
int mid=(t[p].l+t[p].r)>>1;
pushdown_addd(p);
pushdown_muu(p);
long long sum=0;
if (x<=mid) sum+=query(lc,x,y);
if (y>mid) sum+=query(rc,x,y);
return sum;
}
int main()
{
n=read();
m=read();
mod=read();
for (int i=1;i<=n;i++)
{
a[i]=read();
}
build (1,1,n);
for (int i=1;i<=m;i++)
{
c=read();
if (c==1)
{
x=read();
y=read();
k=read();
muu(1,x,y,k);
}
if (c==2)
{
x=read();
y=read();
k=read();
addd(1,x,y,k);
}
if (c==3)
{
x=read();
y=read();
printf("%lld\n",query(1,x,y)%mod);
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...