這題有毒啊,敲了我一晚上加一早上,總算a了。
由於有加和乘兩個操作,要用2個lazy陣列。
核心難點就是2個lazy陣列會相互影響。
因為乘影響加,加不影響乘,所以我們先算乘。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define rep(i,m,n) for(int i=m;i<=n;i++)
#define dop(i,m,n) for(int i=m;i>=n;i--)
#define lowbit(x) (x&(-x))
#define ll long long
#define inf 2147483647
using
namespace
std;
inline
intread
() while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}const
int maxn=100000;
ll a[maxn+10],sum[(maxn<<2)+10],n,m,b,c,d,e,add[(maxn<<2)+10],mul[(maxn<<2)+10],mod; //安全起見,都開long long
void
pushdown
(int now,int m)
if(add[now])
}void
build
(int now,int l,int r)
}ll query
(int now,int l,int r,int wl,int wr)
void
change
(int now,int l,int r,int wl,int wr,int p,int mode)
pushdown(now,r-l+1);
int mid=(l+r)>>1;
change(now<<1,l,mid,wl,wr,p,mode);
change(now<<1|1,mid+1,r,wl,wr,p,mode);
sum[now]=(sum[now<<1]+sum[now<<1|1])%mod;
}int
main
() if(b==2)
if(b==3)
}return
0;}
洛谷 P3373 模板 線段樹 2
如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個...
線段樹(洛谷P3373模板2)
日常膜拜dalao 財神萬歲!話說這個線段樹今天折磨了我五個小時然後終於發現少打了乙個2.離開學還有4天然而作業一字未動絲毫不慌 ing 原題連線 洛谷線段樹模板2 要求 如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 ...
洛谷 P3373 模板 線段樹 2
洛谷 p3373 模板 線段樹 2 已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 思路 兩個lazy標記 add和mul,怎麼下放?我遇到的問題 很多題解上來就說先乘後加比先加後乘好處理。我疑惑 如果有兩個lazy標記,不知...