乘法的標記和加法的標記相同,主要差別是在標記下傳的時候,一定要先對之前的標記進行操作,即把當前的數乘以乘法標記再加上加法標記,這步必須同時進行,因為如果分開的話,若是加上加法標記再做乘法的話答案就會出錯。
#include
using
namespace std;
#define for0(a,b) for(int i = a; i < b; ++i)
#define fore(a,b) for(int i = a; i <= b; ++i)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef
long
long ll;
typedef pair<
int,
int> pii;
const
int maxn =
200000+10
;ll sum[maxn<<2]
,n,p,lazy[maxn<<2]
,lazy2[maxn<<2]
,m;void
pushup
(int rt)
void
pushdown
(int rt,
int l,
int r)
// if(lazy2[rt] != 1)
}void
build
(int l,
int r,
int rt)
int mid =
(l+r)
>>1;
build
(lson)
;build
(rson)
;pushup
(rt);}
void
updateadd
(int l,
int r,
int v,
int l,
int r,
int rt)
int mid =
(l+r)
>>1;
pushdown
(rt,l,r)
;updateadd
(l,r,v,lson)
;updateadd
(l,r,v,rson)
;pushup
(rt);}
void
updatemul
(int l,
int r,
int v,
int l,
int r,
int rt)
int mid =
(l+r)
>>1;
pushdown
(rt,l,r)
;updatemul
(l,r,v,lson)
;updatemul
(l,r,v,rson)
;pushup
(rt);}
ll query
(int l,
int r,
int l,
int r,
int rt)
int mid =
(l+r)
>>1;
pushdown
(rt,l,r)
; ll v =
(query
(l,r,lson)
+query
(l,r,rson)
)%p;
pushup
(rt)
;return v;
}int
main()
else
if(opt ==2)
else
if(opt ==3)
}return0;
}
P2023 AHOI2009 維護序列
線段樹模板題 此題關鍵在於 pushdown 考慮加法標記 lt1 和 乘法標記 lt2 考慮到乘法優先順序 要 高於 加法優先順序 因此在 pushdown 裡先 傳 lt2 再傳 lt1 注意 lt2 傳的時候,兩個兒子的 lt1 也都要乘上 lt2 code include define in...
線段樹模板 洛谷P2023
傳送門 這個題目的區間更新有加法和乘法。所以比裸的線段樹難一點點吧,也就僅僅是一點點。既然存在兩個操作,所以我們就要維護兩個tag,乙個加法乙個乘法。但是pushdown的時候這兩個tag怎麼pushdown呢?乘法的優先順序顯然比加法高,所以我們在mul更新的時候要先pushdown,這是乙個要點...
洛谷P2023 AHOI2009 維護序列
題目鏈結 p2023 ahoi2009 維護序列 解題思路 經典線段樹題目 注意 一定記得要取模!而且建樹時要把乘法lazytag 即t i mul 置為1!如果不用讀入優化就老老實實scanf,否則容易超時 做這個題之前或者做完這個題想再鞏固一下,可以看看這道題,兩道題幾乎一模一樣 洛谷p3373...