P2023 維護序列 線段樹標記,乘法和加法標記

2021-09-12 16:16:17 字數 1934 閱讀 1952

乘法的標記和加法的標記相同,主要差別是在標記下傳的時候,一定要先對之前的標記進行操作,即把當前的數乘以乘法標記再加上加法標記,這步必須同時進行,因為如果分開的話,若是加上加法標記再做乘法的話答案就會出錯。

#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...