動態範圍查詢問題:
一、線段樹+點修改
支援操作:
update(x,v): 將ax修改為v
query(l,r) : 計算[l,r]內的最小值
1intminv[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之和。
1intminv[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標記的判斷。
intminv[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操作的模板:
structintervaltree
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...