例題 線段樹 lazy

2021-07-14 18:33:43 字數 3123 閱讀 6938

1、

(1)、lazy思想:對整個結點進行的操作,先在結點上做標記,而並非真正執行,直到根據查詢操作的需要分到下層。

(2)、延遲標記 lazy:如果需要對乙個區間中每乙個葉結點進行操作,我們不妨先別忙著操作,而是在所有大區間上做乙個標記, 下一次遇到或要用到時,再進行處理(標記傳遞),達到減少操作次數,提高線段樹的效率的作用。

2、

nkoj 2297 數列操作2

時間限制 : 10000 ms 空間限制 : 165536 kb

問題描述

給出一列數(1≤i≤n),總共有m次操作,操作分如下兩種:

1.add x y z 將x到y區間的所有數字加上z

2.ask x y 將x到y區間的最大乙個數字輸出

輸入格式

第一行,乙個整數n

第二行,n個空格間隔的整數,表示數列一開始的情形

第三行,乙個整數m

接下來m行,表示m條操作

樣例輸入

5 1 2 3 2 5

5 add 1 4 3

ask 2 3

ask 3 5

add 2 4 2

ask 2 5

樣例輸出

6 6

8提示

m,n<=100000

x,y<=100000

z<=1000

思路

lazy

**:

#include

#include

using

namespace

std;

const

int need=200003;//資料有鬼

struct fyt[need*4];

int a[need];

int x,y,z;

void build(int s,int x,int y)

build(s<<1,x,(x+y)/2),build((s<<1)|1,(x+y)/2+1,y);

t[s].val=max(t[s<<1].val,t[(s<<1)|1].val);

}void putdown(int s)

void add(int s)

if(!(y1].a||x>t[s<<1].b)) add(s<<1);

if(!(y1)|1].a||x>t[(s<<1)|1].b)) add((s<<1)|1);

t[s].val=max(t[s<<1].val,t[(s<<1)|1].val);

}int getmax(int s)

int main()

else

}}

2、

nkoj 2295 塗色

時間限制 : 10000 ms 空間限制 : 165536 kb

問題描述輸入格式

第一行,乙個整數n,表示總的運算元

以後n行輸入三個整數(n<=100000)。

第乙個數為1表示塗色,0表示擦去。

第二、三個數表示線段a,b。

輸出格式

有多少條單位線段[k,k+1]被塗上了顏色。

輸入樣例1:

5 1 1 15

0 4 9

1 7 18

1 7 9

0 1 3

輸入樣例2:

4 1 1 8

0 4 8

1 7 8

0 1 3

輸出樣例1:

12輸出樣例2:

2思路

1、因為題所求為線段數量,而以點為葉節點不好討論,所以葉節點表示乙個單位線段,即[x,mid]、[mid,y]分別為左兒子和右兒子表示的區間。

注意a+1==b時才表示為葉節點。

2、lazy不僅儲存要下放的狀態還表示該區間的狀態。

因為狀態較少,且子節點和父節點狀態很可能一致,所以才這樣處理。

**:

#include#includeusing namespace std;

const

int need=200013;

struct fyt[need*2]; //-1 clean 1 paint 0 表示該區間中既有塗了顏色的也有沒塗的

int c[need>>1],le[need*2],ri[need*2];

int tot=0,x,y;

void build(int x,int y)

le[s]=tot+1;build(x,(x+y)>>1);

ri[s]=tot+1;build((x+y)>>1,y);

}void putdown(int s)

void clean(int s)

//如果「putdown」中沒判斷是否為葉節點,這裡就要先判斷。

if(t[s].lazy>0) putdown(s);

if(!(t[le[s]].a>y||t[le[s]].bif(!(t[ri[s]].a>y||t[ri[s]].bvoid paint(int s)

if(t[s].lazy

<0) putdown(s);

if(!(t[le[s]].a>y||t[le[s]].bif(!(t[ri[s]].a>y||t[ri[s]].bint solve(int s)

int main()

printf("%d",solve(1));

}

相似題:

(lazy 相似)

3、

例題 線段數 lazy

1 nkoj 1887 noip2012 day2 借教室 時間限制 40000 ms 空間限制 128000 kb 問題描述 在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要 向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教...

線段樹 lazy標記

每個節點代表區間 唯一根節點,也就是全部區間 葉節點是長度為1的子區間,也就是所代表陣列上的乙個點 const int maxn 1e3 struct segmenttree e 4 maxn 建樹 void build int p,int l,int r int mid l r 2 build p...

例題 線段樹

1 注意討論不能建樹的情況 nkoj 1321 數列操作問題 時間限制 10000 ms 空間限制 165536 kb 問題描述 假設有一列數 1 i n 支援如下兩種操作 將ak的值加d。k,d是輸入的數 輸出as as 1 at。s,t都是輸入的數,s t 輸入格式 第一行乙個整數n,第二行為n...