暑假 實用資料結構 動態範圍查詢問題

2021-07-10 20:51:03 字數 2735 閱讀 1382

動態範圍查詢問題:

一、線段樹+點修改

支援操作:

update(x,v): 將ax修改為v

query(l,r) : 計算[l,r]內的最小值

1

intminv[maxn];

2int

ql,qr;

3int query(int u,int l,int

r) 10

11int p,v; //

a[p]=v

12void update(int u,int l,int

r) //

葉節點則修改

14int m=l+(r-l)+1;15

if(p<=m) update(2*u,l,m); else update(2*u+1,m+1,r); //

遞迴p所在子樹

16 minv[u]=min(minv[2*u],minv[2*u+1]); //

更新當前minv

17 }

聯絡題目:la3938

二、線段樹+區間修改

快速序列操作1:

支援操作:

add(l,r,v):

query(l,r):計算[l,r]內的最小值

、最大值、區間和。

關於演算法:在的基礎上增加了addv,這種為了避免複雜操作而打標記的方法與鍊錶題uva12657相通,新增maintain維護結點資訊。需要注意的是query的新引數add是記錄根到「葉子」路徑上祖先的add之和。

1

intminv[maxn],addv[maxn],sumv[maxn],maxv[maxn];2//

maintain維護u的結點資訊

3void maintain(int u,int l,int

r)11 minv[u] += addv[u]; maxv[u] += addv[u]; sumv[u] += addv[u]*(r-l+1

); 12

//亦 葉子結點

13//

考慮到add 14}

1516

17int y1,y2,v; //

a[y1~y2] += v

18void add(int u,int l,int

r)26 maintain(u,l,r); //

遞迴結束後維護u結點資訊 27}

2829

intql,qr;

30int _min=inf,_max=-inf,_sum=0

; 31

int query(int u,int l,int r,int add)

37else

42 }

快速序列操作2:

支援操作:

set(l,r,v) : a[l~r]=v

query(l,r): 計算[l,r]內的最小值、最大值、區間和

。關於演算法:注意到 1 類題目的add操作對於順序是沒有要求的,而 2 類題目中的set則是有順序要求,如果順序改變結果亦會改變。所以泛泛地說:任意兩個set操作不能出現祖先後代的關係。所以必要時需要把set下傳給子結點。 但也可以找到set是祖先後輩關係的反例,這種情況是兩操作並未「相遇」的結果,因為只有「相遇」才會pushdown。要知道處於上方的操作是下方操作之後標記的,於是加入遞迴邊界1:有無set標記的判斷。

int

minv[maxn],setv[maxn],sumv[maxn],maxv[maxn];

//maintain維護u的結點資訊

void maintain(int u,int l,int

r)

if(setv[u] >= 0)

}void pushdown(intu)}

int y1,y2,v; //

a[y1~y2] += v

void set(int u,int l,int

r) maintain(u,l,r);

//遞迴結束後維護u結點資訊

}int

ql,qr;

int _min=inf,_max=-inf,_sum=0

; int query(int u,int l,int

r)

else

if(ql<=l && r<=qr)

else

}

作者所給同時支援add與set操作的模板:

struct

intervaltree

if(setv[o] >= 0)

if(addv[o])

} //標記傳遞

void pushdown(int

o)

if(addv[o])

} void update(int o, int l, int

r) }

else

maintain(o, l, r);

} void query(int o, int l, int r, int

add)

else

if(y1 <= l && y2 >=r)

else

}};

聯絡題目:uva11992

:如果**中包含中文字元會亂碼 ┑( ̄д  ̄)┍

暑假 實用資料結構 KMP

kmp演算法 kmp演算法是字串匹配演算法,可以在o n 的時間完成,演算法包含兩部分,分別是 構造適配函式與兩串匹配。失配邊的使用大大提高了演算法效率,可以理解為已經成功匹配的字元不在重新匹配,因為我們已經知道它是什麼,對應到演算法中 匹配失敗後應該在最大字首之後繼續匹配,因為某字尾已與最大字首匹...

mooc 資料結構作業(一)範圍查詢 Range

數軸上有n個點,對於任一閉區間 a,b 試計算落在其內的點數。第一行包括兩個整數 點的總數n,查詢的次數m。第二行包含n個數,為各個點的座標。以下m行,各包含兩個整數 查詢區間的左 右邊界a和b。對每次查詢,輸出落在閉區間 a,b 內點的個數。見英文題面 0 n,m 5 105 對於每次查詢的區間 ...

動態資料結構

所謂動態資料結構,是指在執行時刻才能確定所需記憶體空間大小的資料結構,動態資料結構所使用的的記憶體稱為動態記憶體。動態記憶體的使用有一定的危險,必須遵守一定的規則。動態申請的內存在不需要時必須及時釋放,如果不斷地申請動態記憶體而不加以釋放,將導致記憶體資源的枯竭。c 處理動態記憶體提供了一對操作符n...