From ae9f45b1f66032f9fa83d492f8ebfe80fa0b0320 Mon Sep 17 00:00:00 2001 From: 110034024 Date: Sun, 14 May 2023 23:37:55 +0800 Subject: [PATCH 1/7] segment_tree_beats --- src/others/segment_tree_beats.md | 782 +++++++++++++++++++++++++++++++ 1 file changed, 782 insertions(+) create mode 100644 src/others/segment_tree_beats.md diff --git a/src/others/segment_tree_beats.md b/src/others/segment_tree_beats.md new file mode 100644 index 00000000..1642591b --- /dev/null +++ b/src/others/segment_tree_beats.md @@ -0,0 +1,782 @@ +# Introduction to Segment Tree Beats +## 前言 +Segment Tree Beats(簡稱STB)是改良版本的線段樹,可以解決提升線段樹的效率。STB進行區間查詢和區間修改等基本操作時,可在保持時間複雜度不變的情況下,簡化不必要的操作。 +## 建造樹節點 +STB的每一個節點劃分成 +* 總和(sum) +* 最大值(max1)、次大值(max2)、最大值次數(maxc) +* 最小值(min1)、次小值(min2)、最小值次數(minc) +* 懶惰標記(lazy) +```cpp +using ll = long long; +ll A[MAXN]; +struct node { + ll sum; // 總和 + ll max1; // 最大值 + ll max2; // 次大值 + ll maxc; // 最大值次數 + ll min1; // 最小值 + ll min2; // 次小值 + ll minc; // 最小值次數 + ll lazy; // 懶惰標記 +} T[MAXN * 4]; +``` +## 建造STB +對root進行呼叫,不斷對兩個子節點進行呼叫,達成遞迴建樹。當左右邊界相等,表示當前節點為葉節點,總和(sum)、最大值(max1)、最小值(min1)是節點本身的值。
+時間複雜度是$O(n)$。 +```cpp +// 節點t的區間範圍是[tl, tr] +void build(int t = 1, int tl = 0, int tr = N - 1) { + T[t].lazy = 0; + if(tl == tr) { + T[t].sum = T[t].max1 = T[t].min1 = A[tl]; + T[t].maxc = T[t].minc = 1; + T[t].max2 = -llINF; + T[t].min2 = llINF; + return; + } + int tm = (tl + tr) >> 1; + build(t << 1, tl, tm); + build(t << 1 | 1, tm + 1, tr); + merge(t); +} +``` +## 區間修改 +Update函數主要是針對一段目標範圍,進行區間修改。由Push函數更新子節點的數值。 +按照不同功能,劃分成 +* update_add / push_add +* update_max / push_max +* update_min / push_min +* push_down +### update_add +對目標區間[l, r]所有數值都增加v。假設目標區間範圍是[l, r],變化值是v,當前節點的區間範圍是[tl, tr]。 +* 如果節點區間完全不在目標區間內,就不需要更新。 +* 如果節點區間完全在目標區間內,直接對當前節點進行push_add操作。 +* 否則不斷對兩個子節點進行更新操作,最後用兩個子節點的數值更新當前節點的數值。 +```cpp +const ll llINF = LLONG_MAX; +// 目標區間範圍是[l, r],變化值是v,節點t的區間範圍是[tl, tr] +void update_add(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) { + if(r < tl || tr < l) { return; } + if(l <= tl && tr <= r) { + push_add(t, tl, tr, v); + return; + } + push_down(t, tl, tr); + int tm = (tl + tr) >> 1; + update_add(l, r, v, t << 1, tl, tm); + update_add(l, r, v, t << 1 | 1, tm + 1, tr); + merge(t); +} +``` +### push_add +對一段範圍加上一常數時,更新子節點的數值。假設節點t的區間範圍是[tl, tr],變化值是v。如果變化值為0,就不需要更新。從l到r每個元素都增加v,所以sum會增加(r - l + 1) * v。最大值、最小值、懶惰標記直接增加v。次大值、次小值則需要先判斷存在,再增加v。 +```cpp +// 節點t的區間範圍是[tl, tr],變化值是v +void push_add(int t, int tl, int tr, ll v) { + if(v == 0) { return; } + T[t].sum += (tr - tl + 1) * v; + T[t].max1 += v; + if(T[t].max2 != -llINF) { T[t].max2 += v; } + T[t].min1 += v; + if(T[t].min2 != llINF) { T[t].min2 += v; } + T[t].lazy += v; +} +``` +### update_max +對目標區間[l, r]所有比v大的值都替換為v。假設目標區間範圍是[l, r],更新值是v,當前節點的區間範圍是[tl, tr]。 +* 如果節點區間完全不在目標區間內,或更新值大於等於最大值(max1),就不需要更新。 +* 如果節點區間完全在目標區間內,且次大值(max2)小於更新值,直接對當前節點進行push_max操作。 +* 否則不斷對兩個子節點進行更新操作,最後用兩個子節點的數值更新當前節點的數值。 +```cpp +// 目標區間範圍是[l, r],更新值是v,節點t的區間範圍是[tl, tr] +void update_max(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) { + if(r < tl || tr < l || v >= T[t].max1) { return; } + if(l <= tl && tr <= r && v > T[t].max2) { + push_max(t, v, tl == tr); + return; + } + push_down(t, tl, tr); + int tm = (tl + tr) >> 1; + update_max(l, r, v, t << 1, tl, tm); + update_max(l, r, v, t << 1 | 1, tm + 1, tr); + merge(t); +} +``` +### push_max +更新子節點的最大值。假設節點t的更新值是v,l代表是否為葉節點。如果更新值大於等於最大值(max1),就不需要更新。將最大值更新為v,所以先從sum扣除本來的max1 * maxc,再增加v * maxc。接著處理最小值、次小值。如果當前節點是葉節點,最小值直接設為v。否則更新最小值、次小值。 +```cpp +// 節點t的更新值是v,l代表是否為葉節點,l是true表示當前節點是葉節點 +void push_max(int t, ll v, bool l) { + if(v >= T[t].max1) { return; } + T[t].sum -= T[t].max1 * T[t].maxc; + T[t].max1 = v; + T[t].sum += T[t].max1 * T[t].maxc; + if(l) { + T[t].min1 = T[t].max1; + } else { + if(v <= T[t].min1) { + T[t].min1 = v; + } else if(v < T[t].min2) { + T[t].min2 = v; + } + } +} +``` +### update_min +對目標區間[l, r]所有比v小的值都替換為v。假設目標區間範圍是[l, r],更新值是v,當前節點的區間範圍是[tl, tr]。 +* 如果節點區間完全不在目標區間內,或更新值小於等於最小值(min1),就不需要更新。 +* 如果節點區間完全在目標區間內,且次小值(min2)大於更新值,直接對當前節點進行push_min操作。 +* 否則不斷對兩個子節點進行更新操作,最後用兩個子節點的數值更新當前節點的數值。 +```cpp +// 目標區間範圍是[l, r],更新值是v,節點t的區間範圍是[tl, tr] +void update_min(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) { + if(r < tl || tr < l || v <= T[t].min1) { return; } + if(l <= tl && tr <= r && v < T[t].min2) { + push_min(t, v, tl == tr); + return; + } + push_down(t, tl, tr); + int tm = (tl + tr) >> 1; + update_min(l, r, v, t << 1, tl, tm); + update_min(l, r, v, t << 1 | 1, tm + 1, tr); + merge(t); +} +``` +### push_min +更新子節點的最小值。假設節點t的更新值是v,l代表是否為葉節點。如果更新值小於等於最小值(min1),就不需要更新。將最小值更新為v,所以先從sum扣除本來的min1 * minc,再增加v * minc。接著處理最大值、次大值。如果當前節點是葉節點,最大值直接設為v。否則更新最小值、次小值。 +```cpp +// 節點t的更新值是v,l代表是否為葉節點,l是true表示當前節點是葉節點 +void push_min(int t, ll v, bool l) { + if (v <= T[t].min1) { return; } + T[t].sum -= T[t].min1 * T[t].minc; + T[t].min1 = v; + T[t].sum += T[t].min1 * T[t].minc; + if(l) { + T[t].max1 = T[t].min1; + } else { + if(v >= T[t].max1) { + T[t].max1 = v; + } else if(v > T[t].max2) { + T[t].max2 = v; + } + } +} +``` +### push_down +對一段範圍進行區間操作時,將當前節點的懶惰標記(lazy)、最大值(max1)、最小值(min1)向下更新到子節點。假設節點t的區間範圍是[tl, tr]。如果當前節點是葉節點,就不需要向下更新。 +```cpp +// 節點t的區間範圍是[tl, tr] +void push_down(int t, int tl, int tr) { + if(tl == tr) return; + + int tm = (tl + tr) >> 1; + push_add(t << 1, tl, tm, T[t].lazy); + push_add(t << 1 | 1, tm + 1, tr, T[t].lazy); + T[t].lazy = 0; + + push_max(t << 1, T[t].max1, tl == tm); + push_max(t << 1 | 1, T[t].max1, tm + 1 == tr); + + push_min(t << 1, T[t].min1, tl == tm); + push_min(t << 1 | 1, T[t].min1, tm + 1 == tr); +} +``` +## Merge函數 +整合兩個子節點的數值,更新當前節點的數值。劃分成3個部分分別處理總和、最大值、最小值。 +* 總和為左子節點總和加上右子節點總和。 +* 如果左右子節點最大值相同,最大值為左子節點最大值(max1),次大值為左右子節點次大值較大者,最大值次數為左右子節點最大值次數(maxc)相加。如果左子節點最大值較大,最大值為左子節點最大值,次大值為max(左子節點次大值, 右子節點最大值),最大值次數為左子節點最大值次數。如果右子節點最大值較大,最大值為右子節點最大值,次大值為max(左子節點最大值, 右子節點次大值),最大值次數為右子節點最大值次數。 +* 如果左右子節點最小值相同,最小值為左子節點最小值(min1),次小值為左右子節點次小值較小者,最小值次數為左右子節點最小值次數(minc)相加。如果左子節點最小值較小,最小值為左子節點最小值,次大值為min(左子節點次小值, 右子節點最小值),最小值次數為左子節點最小值次數。如果右子節點最小值較小,最小值為右子節點最小值,次小值為min(左子節點最小值, 右子節點次小值),最小值次數為右子節點最小值次數。 +```cpp +// 節點t +void merge(int t) { + + T[t].sum = T[t << 1].sum + T[t << 1 | 1].sum; + + if (T[t << 1].max1 == T[t << 1 | 1].max1) { + T[t].max1 = T[t << 1].max1; + T[t].max2 = max(T[t << 1].max2, T[t << 1 | 1].max2); + T[t].maxc = T[t << 1].maxc + T[t << 1 | 1].maxc; + } else { + if (T[t << 1].max1 > T[t << 1 | 1].max1) { + T[t].max1 = T[t << 1].max1; + T[t].max2 = max(T[t << 1].max2, T[t << 1 | 1].max1); + T[t].maxc = T[t << 1].maxc; + } else { + T[t].max1 = T[t << 1 | 1].max1; + T[t].max2 = max(T[t << 1].max1, T[t << 1 | 1].max2); + T[t].maxc = T[t << 1 | 1].maxc; + } + } + + if (T[t << 1].min1 == T[t << 1 | 1].min1) { + T[t].min1 = T[t << 1].min1; + T[t].min2 = min(T[t << 1].min2, T[t << 1 | 1].min2); + T[t].minc = T[t << 1].minc + T[t << 1 | 1].minc; + } else { + if (T[t << 1].min1 < T[t << 1 | 1].min1) { + T[t].min1 = T[t << 1].min1; + T[t].min2 = min(T[t << 1].min2, T[t << 1 | 1].min1); + T[t].minc = T[t << 1].minc; + } else { + T[t].min1 = T[t << 1 | 1].min1; + T[t].min2 = min(T[t << 1].min1, T[t << 1 | 1].min2); + T[t].minc = T[t << 1 | 1].minc; + } + } +} +``` +## 區間查詢 +對一段範圍進行區間總和查詢。假設目標區間範圍是[l, r],節點t的區間範圍是[tl, tr]。 +* 如果節點區間完全不在目標區間內,就回傳0。 +* 如果節點區間完全在目標區間內,直接回傳當前節點總和(sum)。 +* 否則將當前節點的懶惰標記(lazy)、最大值(max1)、最小值(min1)向下更新到子節點,接著不斷對兩個子節點進行區間查詢總和,最後用兩個子節點的總和作為查詢的答案。 +```cpp +// 目標區間範圍是[l, r],節點t的區間範圍是[tl, tr] +ll query_sum(int l, int r, int t = 1, int tl = 0, int tr = N - 1) { + if (r < tl || tr < l) { return 0; } + if (l <= tl && tr <= r) { return T[t].sum; } + push_down(t, tl, tr); + int tm = (tl + tr) >> 1; + return query_sum(l, r, t << 1, tl, tm) + + query_sum(l, r, t << 1 | 1, tm + 1, tr); +} +``` +# Basic Segment Tree Beats Problems +## RMQ +要進行區間最大值查詢,將query_sum改成return T[t].max1即可。 +```cpp +// 目標區間範圍是[l, r],節點t的區間範圍是[tl, tr] +ll query_max(int l, int r, int t = 1, int tl = 0, int tr = N - 1) { + if (r < tl || tr < l) { return 0; } + if (l <= tl && tr <= r) { return T[t].max1; } + push_down(t, tl, tr); + int tm = (tl + tr) >> 1; + return query_max(l, r, t << 1, tl, tm) + + query_max(l, r, t << 1 | 1, tm + 1, tr); +} +``` +## For all i in [l, r], change $A_i$ to $x$ +對一段範圍進行區間修改。 +* 如果節點區間完全不在目標區間內,就不需要更新。 +* 如果節點區間完全在目標區間內,直接將節點的總和(sum)、最大值(max1)設為v。 +* 不斷對兩個子節點進行更新操作,最後用兩個子節點的數值更新當前節點的數值。 +```cpp +void update_set(int l, int r, ll v = x, int t = 1, int tl = 1, int tr = N) { + if (r < tl || tr < l) { return; } + if (tl == tr) { + T[t].sum = T[t].max = v; + return; + } + int tm = (tl + tr) / 2; + update_mod(l, r, v, t * 2, tl, tm); + update_mod(l, r, v, t * 2 + 1, tm + 1, tr); + merge(t); +} +``` +## For all i in [l, r], change $A_i$ to $A_i$ + $x$ +跟上一題一樣,差在更新的方式是T[t].sum += v、T[t].max += v。 +```cpp +void update_set(int k, ll v = x, int t = 1, int tl = 1, int tr = N) { + if(r < tl || tr < l) { return; } + if(tl == tr) { + T[t].sum += v; + T[t].max += v; + return; + } + int tm = (tl + tr) / 2; + if(k <= tm) { + update_set(k, v, t * 2, tl, tm); + } else { + update_set(k, v, t * 2 + 1, tm + 1, tr); + } + merge(t); +} +``` +## For all i in [l, r], change $A_i$ to max($A_i$ - $x$, 0) +跟上一題一樣,差在更新的方式是T[t].sum = max(T[t].sum - v, 0)、T[t].max = max(T[t].max - v, 0); +
+Solution +```cpp +void update_set(int k, ll v = x, int t = 1, int tl = 1, int tr = N) { + if(r < tl || tr < l) { return; } + if(tl == tr) { + T[t].sum = max(T[t].sum - v, 0); + T[t].max = max(T[t].max - v, 0); + return; + } + int tm = (tl + tr) / 2; + if(k <= tm) { + update_set(k, v, t * 2, tl, tm); + } else { + update_set(k, v, t * 2 + 1, tm + 1, tr); + } + merge(t); +} +``` +
+ +## [Codeforces 438D The Child and Sequence][1] +[1]: https://codeforces.com/contest/438/problem/D +給定一個序列$a_i$,並對其進行$m$筆操作。操作有3種: +1. 給定l, r,請輸出區間總和a[l]+...+a[r] +2. 給定l, r, 對區間[l, r]的每一個數取模,即$a_i$ = $a_i$ $mod$ $x$ +3. 給定k, x,將a[k]的值改為x + +我們在這題只需要總和(sum)、最大值(max)。 +update_mod處理操作2,update_set處理操作3。 +因為操作3只更改a[k]的值,update_set可以進一步優化為判斷k與當前節點區間中點位置tm的大小關係,如果k小於等於tm,只更新左子節點。否則只更新右子節點。 +```cpp +#include +using namespace std; +using ll = long long; + +const int MAXN = 100001; + +int N; +ll a[MAXN]; + +struct node { + ll sum; // 總和 + ll max; // 最大值 +} T[MAXN * 4]; + +void merge(int t) { + T[t].sum = T[t << 1].sum + T[t << 1 | 1].sum; + T[t].max = max(T[t << 1].max, T[t << 1 | 1].max); +} + +void build(int t = 1, int tl = 0, int tr = N - 1) { + if (tl == tr) { + T[t].sum = T[t].max = a[tl]; + return; + } + int tm = (tl + tr) >> 1; + build(t << 1, tl, tm); + build(t << 1 | 1, tm + 1, tr); + merge(t); +} + +void update_mod(int l, int r, ll v, int t = 1, int tl = 1, int tr = N) { + if (r < tl || tr < l || v > T[t].max) { return; } + if (tl == tr) { + int val = T[t].max % v; + T[t].sum = T[t].max = val; + return; + } + int tm = (tl + tr) / 2; + update_mod(l, r, v, t * 2, tl, tm); + update_mod(l, r, v, t * 2 + 1, tm + 1, tr); + merge(t); +} + +void update_set(int k, ll v, int t = 1, int tl = 1, int tr = N) { + if(r < tl || tr < l) { return; } + if(tl == tr) { + T[t].sum = T[t].max = v; + return; + } + int tm = (tl + tr) / 2; + if(k <= tm) { + update_set(k, v, t * 2, tl, tm); + } else { + update_set(k, v, t * 2 + 1, tm + 1, tr); + } + merge(t); +} + +ll query(int l, int r, int t = 1, int tl = 1, int tr = N) { + if(r < tl || tr < l) { return 0; } + if(l <= tl && tr <= r) { return T[t].sum; } + int tm = (tl + tr) / 2; + return query(l, r, t * 2, tl, tm) + + query(l, r, t * 2 + 1, tm + 1, tr); +} + +int main() { + int Q; + cin >> N >> Q; + for (int i = 1; i <= N; i++) { cin >> a[i]; } + build(); + while(Q--) { + int t; + cin >> t; + if (t == 1) { + int l, r; + cin >> l >> r; + cout << query(l, r) << '\n'; + } else if (t == 2) { + int l, r; + ll x; + cin >> l >> r >> x; + update_mod(l, r, x); + } else if (t == 3) { + int k; + ll x; + cin >> k >> x; + update_set(k, x); + } + } +} +``` +# Advanced Segment Tree Beats Problems +## [洛谷P6242 【模板】線段樹 3][2] +[2]: https://www.luogu.com.cn/problem/P6242 +給定一個序列$A_i$、輔助序列$B_i$,並對其進行$m$筆操作。操作有3種: +1. 給定l, r, k,對區間[l, r]的每一個數加上k,即$A_i$ = $A_i$ + $k$ +2. 給定l, r, v, 對區間[l, r]的每一個數取最小值,即$A_i$ = min($A_i$, $v$) +3. 給定l, r, 請輸出區間總和a[l]+...+a[r] +4. 給定k, x,對於區間[l, r]的每個i,請輸出$A_i$的最大值 +5. 給定l, r,對於區間[l, r]的每個i,請輸出$B_i$的最大值 +每次操作後,將$B_i$設為max($B_i$, $A_i$) +* 1 $\leq$ n, m $\leq$ 500000 +```cpp +#include +using namespace std; +using ll = long long; + +const int N = 200021; +int n, m, A[N]; + +struct SegmentTreeBeats { + struct node { + int mx_a, smx, cnt, mx_b; + ll sum, add_a1, add_a2, add_b1, add_b2; + } t[N<<2]; + + void pushup(int x) { + t[x].mx_a = max(t[x*2].mx_a, t[x*2+1].mx_a); + t[x].mx_b = max(t[x*2].mx_b, t[x*2+1].mx_b); + t[x].sum = t[x*2].sum + t[x*2+1].sum; + if(t[x*2].mx_a == t[x*2+1].mx_a) t[x].smx = max(t[x*2].smx, t[x*2+1].smx); + else if(t[x*2].mx_a > t[x*2+1].mx_a) t[x].smx = max(t[x*2].smx, t[x*2+1].mx_a); + else t[x].smx = max(t[x*2].mx_a, t[x*2+1].smx); + t[x].cnt = (t[x*2].mx_a >= t[x*2+1].mx_a) * t[x*2].cnt + (t[x*2+1].mx_a >= t[x*2].mx_a) * t[x*2+1].cnt; + } + + void addtag(int x, int l, int r, ll A, ll b, ll c, ll d) { + t[x].sum += A*t[x].cnt + c*(r-l+1-t[x].cnt); + t[x].mx_b = max((ll)t[x].mx_b, t[x].mx_a + b); + t[x].add_b1 = max(t[x].add_b1, t[x].add_a1 + b); + t[x].add_b2 = max(t[x].add_b2, t[x].add_a2 + d); + t[x].mx_a += A, t[x].add_a1 += A, t[x].add_a2 += c; + if(t[x].smx > -Inf) t[x].smx += c; + } + + void pushdown(int x, int l, int r) { + int mid = (l+r)>>1, mx = max(t[x*2].mx_a, t[x*2+1].mx_a); + ll add_a1 = t[x].add_a1, add_a2 = t[x].add_a2, add_b1 = t[x].add_b1, add_b2 = t[x].add_b2; + if(t[x*2].mx_a == mx) addtag(x*2, l, mid, add_a1, add_b1, add_a2, add_b2); + else addtag(x*2, l, mid, add_a2, add_b2, add_a2, add_b2); + if(t[x*2+1].mx_a == mx) addtag(x*2+1, mid+1, r, add_a1, add_b1, add_a2, add_b2); + else addtag(x*2+1, mid+1, r, add_a2, add_b2, add_a2, add_b2); + t[x].add_a1 = t[x].add_b1 = t[x].add_a2 = t[x].add_b2 = 0; + } + + void build(int x, int l, int r) { + if(l == r){ + t[x].sum = t[x].mx_a = t[x].mx_b = A[l]; + t[x].smx = -Inf, t[x].cnt = 1; + return; + } + int mid = (l+r)>>1; + build(x*2, l, mid), build(x*2+1, mid+1, r); + pushup(x); + } + + void update_add(int x, int l, int r, int L, int R, int k) { + if(l >= L && r <= R){ addtag(x, l, r, k, k, k, k); return; } + int mid = (l+r)>>1; + pushdown(x, l, r); + if(mid >= L) update_add(x*2, l, mid, L, R, k); + if(mid < R) update_add(x*2+1, mid+1, r, L, R, k); + pushup(x); + } + + void update_min(int x, int l, int r, int L, int R, int val) { + if(t[x].mx_a <= val) return; + if(l >= L && r <= R && t[x].smx < val){ addtag(x, l, r, val-t[x].mx_a, val-t[x].mx_a, 0, 0); return; } + int mid = (l+r)>>1; + pushdown(x, l, r); + if(mid >= L) update_min(x*2, l, mid, L, R, val); + if(mid < R) update_min(x*2+1, mid+1, r, L, R, val); + pushup(x); + } + + ll query(int x, int l, int r, int L, int R, int id) { + if(l >= L && r <= R) return id == 1 ? t[x].sum : (id == 2 ? t[x].mx_a : t[x].mx_b); + int mid = (l+r)>>1; + pushdown(x, l, r); + ll A = (mid >= L) ? query(x*2, l, mid, L, R, id) : (id == 1 ? 0 : -Inf); + ll b = (mid < R) ? query(x*2+1, mid+1, r, L, R, id) : (id == 1 ? 0 : -Inf); + return (id == 1 ? A+b : max(A, b)); + } +} T; + +int main() { + cin>>n>>m; + for(int i = 1; i <= n; i++) cin>>A[i]; + T.build(1, 1, n); + int type, l, r, k; + while(m--) { + cin>>type>>l>>r; + if(type == 1) { + cin>>k, T.update_add(1, 1, n, l, r, k); + } else if(type == 2) { + cin>>k, T.update_min(1, 1, n, l, r, k); + } else { + cout<< T.query(1, 1, n, l, r, type-2) < +時間複雜度是$O(nlog^2n)$。 +```cpp +#include +using namespace std; +using ll = long long; + +const int N = 160000; + +int n; +int a[N], pos[N]; + +struct STB { + struct node { + ll sum; + ll max1, max2, cnt, num, tag = -1; + ll lazy; + } T[N<<2]; + + void merge(int t) { + T[t].max1 = max(T[t*2].max1, T[t*2+1].max1); + T[t].num = T[t*2].num + T[t*2+1].num; + T[t].sum = T[t*2].sum + T[t*2+1].sum; + if(T[t*2].max1 == T[t*2+1].max1) { + T[t].max2 = max(T[t*2].max2, T[t*2+1].max2); + } + else if(T[t*2].max1 > T[t*2+1].max1) { + T[t].max2 = max(T[t*2].max2, T[t*2+1].max1); + } + else { + T[t].max2 = max(T[t*2].max1, T[t*2+1].max2); + } + T[t].cnt = (T[t*2].max1 >= T[t*2+1].max1) * T[t*2].cnt + (T[t*2+1].max1 >= T[t*2].max1) * T[t*2+1].cnt; + } + + void push_add(int t, int k) { + T[t].sum += (ll)k * T[t].num; + if(T[t].num) { + T[t].max1 += k; + T[t].lazy += k; + if(T[t].max2 > 0) T[t].max2 += k; + if(~T[t].tag) T[t].tag += k; + } + } + + void push_min(int t, int k) { + if(T[t].max1 <= k) { return; } + T[t].sum -= (ll)T[t].cnt * (T[t].max1 - k); + T[t].max1 = k; + T[t].tag = k; + } + + void push_down(int t) { + if(T[t].lazy) { + push_add(t*2, T[t].lazy); + push_add(t*2+1, T[t].lazy); + } + if(~T[t].tag) { + push_min(t*2, T[t].tag); + push_min(t*2+1, T[t].tag); + } + T[t].tag = -1, T[t].lazy = 0; + } + + void insert(int t, int tl, int tr, int pos, int val) { + if(tl == tr) { + T[t].sum = T[t].max1 = val; + T[t].cnt = T[t].num = 1; + return; + } + int tm = (tl+tr)>>1; + push_down(t); + if(tm >= pos) insert(t*2, tl, tm, pos, val); + else insert(t*2+1, tm+1, tr, pos, val); + merge(t); + } + + void update(int l, int r, int k, int id, int t = 1, int tl = 1, int tr = n) { + if(l > r) return; + if(id && T[t].max1 <= k) return; + if(l <= tl && tr <= r){ + if(id && T[t].max2 < k) { + push_min(t, k); + return; + } + if(!id) { + push_add(t, k); + return; + } + } + int tm = (tl+tr)>>1; + push_down(t); + if(tm >= l) update(l, r, k, id, t*2, tl, tm); + if(tm < r) update(l, r, k, id, t*2+1, tm+1, tr); + merge(t); + } +} LB, RB; + +struct Fenwick { + int t[N]; + void update(int pos, int k) { + while(pos <= n) t[pos] += k, pos += (pos&-pos); + } + int get(int pos) { + int ret = 0; + while(pos) ret += t[pos], pos -= (pos&-pos); + return ret; + } +} T; + +int main() { + cin>>n; + for(int i = 1; i <= N; i++) cin>>a[i], pos[a[i]] = i; + + for(int i = 1; i <= N; i++) { + RB.update(pos[i]+1, n, 1, 0); + RB.update(1, pos[i]-1, T.get(pos[i]), 1); + LB.update(1, n-pos[i]+1, -1, 0); + LB.update(1, n-pos[i]+1, n-T.get(pos[i])-1, 1); + RB.insert(1, 1, n, pos[i], i); + LB.insert(1, 1, n, n-pos[i]+1, n); + cout<< RB.T[1].sum - ((ll)i*(n+1) - LB.T[1].sum) + i <<"\n"; + T.update(pos[i], 1); + } +} +``` +## [Codeforces 1572F Stations][4] +[4]: https://codeforces.com/problemset/problem/1572/F +給定n座城市,每座城市有2個屬性$h_i$, $w_i$,第i座城市可以向第j座城市廣播,如果對於所有的k在區間[i, j]中,滿足max{$h_k$} < $h_i$。一開始$h_i$ = 0且$w_i$ = i。 +其發生q次事件,事件有2種: +1. 給定$c_i$, $g_i$, 將城市$c_i$的h變成全局嚴格最大值,並修改其w為$g_i$ +2. 給定$l_i$, $r_i$, 請輸出區間[$l_i$, $r_i$]的每座城市可以覆蓋到的城市數量$b_i$之總和 +* 1 $\leq$ n $\leq$ 200000 + +每個城市覆蓋的區域是一個從i開始的區間,而維護區間右端點是一個單點修改,區間取min問題,另外用一棵線段樹維護區間覆蓋,因為STB裡可直接對值進行修改,所以修改時可以順帶在另一棵線段樹上進行區間修改,即打tag時維護即可。詢問時直接在線段樹查詢區間和。 +時間複雜度是$O(nlog^2n)$。 +```cpp +#include +using namespace std; +using ll = long long; + +const int N = 200021; + +int n, q; + +struct SegmentTree{ + struct node { + ll sum; + ll lazy; + } t[N<<2]; + + void push_down(int x, int l, int r) { + int mid = (l+r)>>1; + t[x*2].sum += (mid-l+1) * t[x].lazy, t[x*2].lazy += t[x].lazy; + t[x*2+1].sum += (r-mid) * t[x].lazy, t[x*2+1].lazy += t[x].lazy; + t[x].lazy = 0; + } + + void update(int x, int l, int r, int L, int R, ll k) { + if(L > R) return; + if(l >= L && r <= R){ t[x].sum += (r-l+1) * k, t[x].lazy += k; return; } + int mid = (l+r)>>1; + push_down(x, l, r); + if(mid >= L) update(x*2, l, mid, L, R, k); + if(mid < R) update(x*2+1, mid+1, r, L, R, k); + t[x].sum = t[x*2].sum + t[x*2+1].sum; + } + + ll get(int x, int l, int r, int L, int R) { + if(l >= L && r <= R) return t[x].sum; + int mid = (l+r)>>1; ll ret = 0; + push_down(x, l, r); + if(mid >= L) ret += get(x*2, l, mid, L, R); + if(mid < R) ret += get(x*2+1, mid+1, r, L, R); + return ret; + } +} BIT; + +struct Segment_Tree_Beats { + struct node { + int mx, smx, cnt, tag = -1; + } t[N<<2]; + + void push_up(int x) { + t[x].mx = max(t[x*2].mx, t[x*2+1].mx); + if(t[x*2].mx == t[x*2+1].mx) t[x].smx = max(t[x*2].smx, t[x*2+1].smx); + else if(t[x*2].mx > t[x*2+1].mx) t[x].smx = max(t[x*2].smx, t[x*2+1].mx); + else t[x].smx = max(t[x*2].mx, t[x*2+1].smx); + t[x].cnt = (t[x*2].mx >= t[x*2+1].mx) * t[x*2].cnt + (t[x*2+1].mx >= t[x*2].mx) * t[x*2+1].cnt; + } + + void addtag(int x, int k, bool frt) { + if(t[x].mx <= k) return; + if(frt) BIT.update(1, 1, n, k+1, t[x].mx, -t[x].cnt); + t[x].mx = t[x].tag = k; + } + + void push_down(int x){ + if(~t[x].tag) + addtag(x*2, t[x].tag, 0), addtag(x*2+1, t[x].tag, 0); + t[x].tag = -1; + } + + void insert(int x, int l, int r, int pos, int val){ + if(l == r){ + BIT.update(1, 1, n, l, t[x].mx, -t[x].cnt), BIT.update(1, 1, n, l, val, 1); + t[x].mx = val, t[x].cnt = 1; return; + } + int mid = (l+r)>>1; + push_down(x); + if(mid >= pos) insert(x*2, l, mid, pos, val); + else insert(x*2+1, mid+1, r, pos, val); + push_up(x); + } + + void update(int x, int l, int r, int L, int R, int k) { + if(t[x].mx <= k || L > R) return; + if(l >= L && r <= R && t[x].smx < k){ addtag(x, k, 1); return; } + int mid = (l+r)>>1; + push_down(x); + if(mid >= L) update(x*2, l, mid, L, R, k); + if(mid < R) update(x*2+1, mid+1, r, L, R, k); + push_up(x); + } +} T; + +int main() { + cin>>n>>q; + for(int i = 1; i <= n; i++) T.insert(1, 1, n, i, i); + int type, c, g, l, r; + while(q--) { + cin>>type; + if(type == 1) { + cin>>c>>g; + T.insert(1, 1, n, c, g), T.update(1, 1, n, 1, c-1, c-1); + } else cin>>l>>r, cout<< BIT.get(1, 1, n, l, r) <<"\n"; + } +} +``` +# Reference +* https://codeforces.com/blog/entry/57319 +* https://usaco.guide/adv/segtree-beats?lang=cpp +* https://www.cnblogs.com/Neal-lee/p/15695984.html +* https://mzhang2021.github.io/cp-blog/historic-segtree \ No newline at end of file From 6b3b584480ef4475575cdebd5b1bfb34008c9b43 Mon Sep 17 00:00:00 2001 From: chihhsi Date: Wed, 14 Jun 2023 23:10:44 +0800 Subject: [PATCH 2/7] revise first half --- src/SUMMARY.md | 14 +- .../image/segment_tree_beats/ma_tag.png | Bin 0 -> 37090 bytes .../image/segment_tree_beats/update_min.png | Bin 0 -> 65937 bytes src/data_structure/intro.md | 3 + src/data_structure/segment_tree_beats.md | 1038 +++++++++++++++++ src/others/segment_tree_beats.md | 782 ------------- 6 files changed, 1049 insertions(+), 788 deletions(-) create mode 100644 src/data_structure/image/segment_tree_beats/ma_tag.png create mode 100644 src/data_structure/image/segment_tree_beats/update_min.png create mode 100644 src/data_structure/intro.md create mode 100644 src/data_structure/segment_tree_beats.md delete mode 100644 src/others/segment_tree_beats.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index e97558aa..52466089 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -10,22 +10,24 @@ - [Basic Greedy](greedy/basic.md) - [Dynamic Programming]() - [Basic DP]() +- [Data Structure](data_structure/intro.md) + - [Segment Tree Beats](data_structure/segment_tree_beats.md) - [Flow]() - [Sqrt Technique](sqrt/intro.md) - [Square Root Decomposition](sqrt/sqrt_decomposition.md) - [Sqrt-Related Observation]() - [Mo's Algorithm]() - [Mathematics](math/intro.md) - - [Arithmetic Function](math/introduction_to_arithmetic_function.md) - - [Linear Sieve](math/linear_sieve.md) - - [數論分塊](math/sqrt_decomposition.md) - - [杜教篩](math/du_sieve.md) - - [Arithmetic Function Revisit](math/revisit_arithmetic_function.md) + - [Introduction to Arithmetic Function](math/introduction_to_arithmetic_function.md) + - [Linear Sieve](math/linear_sieve.md) + - [數論分塊](math/sqrt_decomposition.md) + - [杜教篩](math/du_sieve.md) + - [Revisit Arithmetic Function](math/revisit_arithmetic_function.md) - [Miscellaneous]() -- [C++ Programming Tips]() --- +- [C++ Programming Tips]() - [Make a Codebook](others/codebook.md) - [Useful Resources](others/useful_resources.md) - [CSES Problem Tag]() diff --git a/src/data_structure/image/segment_tree_beats/ma_tag.png b/src/data_structure/image/segment_tree_beats/ma_tag.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2059246985c28d2088ed618782c5e7d2be8fab GIT binary patch literal 37090 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 literal 0 HcmV?d00001 diff --git a/src/data_structure/intro.md b/src/data_structure/intro.md new file mode 100644 index 00000000..238f44da --- /dev/null +++ b/src/data_structure/intro.md @@ -0,0 +1,3 @@ +# Data Structure + +此章節將收錄資料結構。 diff --git a/src/data_structure/segment_tree_beats.md b/src/data_structure/segment_tree_beats.md new file mode 100644 index 00000000..d2c3b3d3 --- /dev/null +++ b/src/data_structure/segment_tree_beats.md @@ -0,0 +1,1038 @@ +# Segment Tree Beats + +## Introduction + +Segment Tree Beats(簡稱 STB)是北京大學的吉如一提出的概念,發表在《区间最值操作与历史最值问题》[^note-1]中。 + +考慮以下問題: + +> 例題 1. [HDU - Gorgeous Sequence](http://acm.hdu.edu.cn/showproblem.php?pid=5306) +> +> 給一個長度為 \\( n \\) 的序列 \\( a \\),並對其進行 \\( m \\) 筆操作。操作有三種: +> +> 1. 給定 \\( l, r, x \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( a_i \\) 修改成 \\( min(a_i, x) \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( a_i \\)的最大值。 +> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( \sum_{i = l}^{r} a_i \\)。 +> +> - \\( n, m \leq 10^6 \\) + +因為在給一個節點打上區間取 \\( min \\) 標記時,我們無法快速更新區間和,所以這題無法透過傳統的懶惰標記來解決。 + +### 區間最值操作 + +考慮下面這一種解法: + +對線段樹每一個節點除了維護區間和 \\( num \\) 之外,還要額外維護區間中的最大值 \\( mx1 \\),嚴格次大值 \\( mx2 \\) 以及最大值個數 \\( cmx \\)。 + +讓區間 \\( [L, R] \\) 對 \\( x \\) 取 \\( min \\),我們先在線段樹中定位這個區間,對定位的每一個節點,我們開始暴力搜尋。搜尋到每一個節點時,我們分三種情況討論: + +1. 當 \\( mx1 \leq x \\) 時,顯然這一次修改不會對這個節點產生影響,直接退出。 +2. 當 \\( mx2 < x < mx1 \\) 時,顯然這一次修改只會影響到所有最大值,所以我們把 \\( num \\) 加上 \\( t \cdot (x - mx) \\),將 \\( mx \\) 更新為 \\( x \\),接著打上標記然後退出。 +3. 當 \\( mx2 \geq x \\) 時,我們無法直接更新這一個節點的資訊,所以在此時,我們對當前節點的左子節點與右子節點進行遞迴搜尋。 + +如下圖所示,左圖是一顆建立在 \\( [1, 4] \\) 上的線段樹,每一個節點紀錄的資訊的左側是區間最大值,右側是嚴格次大值。現在我們要讓區間 \\( [1, 4] \\) 對 \\( 2 \\) 取 \\( min \\)。那麼左圖中紅色邊表示搜尋時經過的邊,紅色字體的節點表示搜索終止的節點,右圖為更新後的線段樹。 + + + +如果進行實作的話,可以發現這個算法的運行效率非常高。實際上可以證明它的時間複雜度是 \\( O(mlogn) \\)。 + +首先我們把最大值看作標記,對線段樹每一個節點,記錄一個標記值,它的值等於它所包含的區間中的最大值。接著如果一個點的標記值與父節點的標記值相同,就把此點的標記刪除,大致轉換如下圖所示(左圖紀錄的是線段樹中的最大值,右圖為轉換後的線段樹): + + + +在轉換之後,線段樹中最多存在 \\( n \\) 個標記。這些標記滿足每一個點的標記值都大於它子樹中的所有標記值。每一個位置實際的值等於從它對應的線段樹葉節點出發,向上走遇到的第一個標記值。 + +觀察上述算法,可以發現我們維護的區間次大值,相當於子樹中標記的最大值。而上述算法的 DFS 過程,相當於打上新的標記後,為了滿足標記值隨深度遞減的性質,在子樹中回收掉值大於它的標記,即標記回收。現在我們來證明標記回收的時間複雜度。 + +首先我們定義標記類的概念: + +1. 同一次區間取 \\( min \\) 標記產生的標記屬於同一類。 +2. 同一個標記下傳產生的新標記屬於同一類。 +3. 不滿足前兩個條件的任意兩個標記屬於不同類。 + +接著定義每一類標記的權值等於這一類標記加上線段樹根節點在線段樹上形成的虛樹大小(即所有子樹中存在此類標記的節點個數),定義勢函數 \\( \Phi(x) \\) 為線段樹中所有標記類的權值總和。 + +考慮一次區間取 \\( max \\) 操作,我們添加了一個新的標記類,它的權值等於我們打標記時經過的節點數,時間複雜度是 \\( O(logn) \\)。 + +考慮一次標記下傳,顯然我們只讓此類標記的權值增加 \\( 1 \\)。 + +考慮 DFS 的過程,我們一旦開始進行暴力 DFS,那麼表示這個點的子樹中一定存在需要回收的標記,而在回收之後這個點的子樹中一定不存在這一類標記,所以我們經過每一個節點,一定存在一類標記權值減少了 \\( 1 \\),那麼勢函數必定隨之減少了 \\( 1 \\)。 + +因為標記下傳只發生在我們在線段樹上定位區間時,所以標記下傳的總次數是 \\( O(mlogn) \\)的,而打標記時對勢函數產生的總貢獻也是 \\( O(mlogn) \\)的,所以勢函數總的變化量只有 \\( O(mlogn) \\)。 + +因為回收標記的時間複雜度不會超過打標記和標記下傳的時間複雜度之和,所以我們就證明了回收標記的複雜度是 \\( O(mlogn) \\)。 + +
Solution Code + +```cpp +#include +#include +#include +using namespace std; +const int N = 1e6 + 6; + +char nc() { + static char buf[1000000], *p = buf, *q = buf; + return p == q && (q = (p = buf) + fread(buf, 1, 1000000, stdin), p == q) + ? EOF + : *p++; +} + +int rd() { + int res = 0; + char c = nc(); + while (!isdigit(c)) c = nc(); + while (isdigit(c)) res = res * 10 + c - '0', c = nc(); + return res; +} + +int t, n, m; +int a[N]; +int mx[N << 2], se[N << 2], cn[N << 2], tag[N << 2]; +long long sum[N << 2]; + +void pushup(int u) { // 向上更新標記 + const int ls = u << 1, rs = u << 1 | 1; + sum[u] = sum[ls] + sum[rs]; + if (mx[ls] == mx[rs]) { + mx[u] = mx[rs]; + se[u] = max(se[ls], se[rs]); + cn[u] = cn[ls] + cn[rs]; + } else if (mx[ls] > mx[rs]) { + mx[u] = mx[ls]; + se[u] = max(se[ls], mx[rs]); + cn[u] = cn[ls]; + } else { + mx[u] = mx[rs]; + se[u] = max(mx[ls], se[rs]); + cn[u] = cn[rs]; + } +} + +void pushtag(int u, int tg) { // 單純打標記,不暴搜 + if (mx[u] <= tg) return; + sum[u] += (1ll * tg - mx[u]) * cn[u]; + mx[u] = tag[u] = tg; +} + +void pushdown(int u) { // 下傳標記 + if (tag[u] == -1) return; + pushtag(u << 1, tag[u]), pushtag(u << 1 | 1, tag[u]); + tag[u] = -1; +} + +void build(int u = 1, int l = 1, int r = n) { // 建樹 + tag[u] = -1; + if (l == r) { + sum[u] = mx[u] = a[l], se[u] = -1, cn[u] = 1; + return; + } + int mid = (l + r) >> 1; + build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); + pushup(u); +} + +void modify_min(int L, int R, int v, int u = 1, int l = 1, int r = n) { + if (mx[u] <= v) return; + if (L <= l && r <= R && se[u] < v) return pushtag(u, v); + int mid = (l + r) >> 1; + pushdown(u); + if (L <= mid) modify_min(L, R, v, u << 1, l, mid); + if (mid < R) modify_min(L, R, v, u << 1 | 1, mid + 1, r); + pushup(u); +} + +int query_max(int L, int R, int u = 1, int l = 1, int r = n) { // 查詢最值 + if (L <= l && r <= R) return mx[u]; + int mid = (l + r) >> 1, r1 = -1, r2 = -1; + pushdown(u); + if (L <= mid) r1 = query_max(L, R, u << 1, l, mid); + if (mid < R) r2 = query_max(L, R, u << 1 | 1, mid + 1, r); + return max(r1, r2); +} + +long long query_sum(int L, int R, int u = 1, int l = 1, int r = n) { // 數值 + if (L <= l && r <= R) return sum[u]; + int mid = (l + r) >> 1; + long long res = 0; + pushdown(u); + if (L <= mid) res += query_sum(L, R, u << 1, l, mid); + if (mid < R) res += query_sum(L, R, u << 1 | 1, mid + 1, r); + return res; +} + +void go() { // 根據題意 + n = rd(), m = rd(); + for (int i = 1; i <= n; i++) a[i] = rd(); + build(); + for (int i = 1; i <= m; i++) { + int op, x, y, z; + op = rd(), x = rd(), y = rd(); + if (op == 0) + z = rd(), modify_min(x, y, z); + else if (op == 1) + printf("%d\n", query_max(x, y)); + else + printf("%lld\n", query_sum(x, y)); + } +} + +signed main() { + t = rd(); + while (t--) go(); + return 0; +} +``` + +
+ +我們接著再看一題。 + +> 例題 2. Picks loves segment tree +> +> 給一個長度為 \\( n \\) 的序列 \\( a \\),並對其進行 \\( m \\) 筆操作。操作有三種: +> +> 1. 給定 \\( l, r, x \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( a_i \\) 修改成 \\( min(a_i, x) \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將\\( a_i \\) 加上 \\( x \\)(\\( x \\) 可能為負數)。 +> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( \sum_{i = l}^{r} a_i \\)。 +> +> - \\( n, m \leq 3 \times 10^5 \\) + +因為加上了區間加減,區間最大值、嚴格次大值和最大值還是可以維護的,所以我們考慮沿用剛才的作法,只需把標記換成二元組 \\( (add, v) \\),表示將當前節點維護的區間先加上 \\( add \\) 再與 \\( v \\) 取最小值。合併標記時,先給當前節點加上一個標記,除了更新當前節點的區間加標記 \\( add \\),還需要把它加到 \\( v \\) 上。當節點 \\( x \\) 下傳標記到它的子節點 \\( ch \\) 時,我們把子節點的標記更新為 \\( (add_{ch} + add_x, min(v_{ch} + add_x, v_x)) \\) 即可。 + +接著我們來證明複雜度。因為有了區間加減這一個操作,剛才的證明就難以沿用了,但可以參考大致的想法。 + +我們可以修改一下標記類的定義: + +1. 同一次區間取 \\( min \\) 標記產生的標記屬於同一類。 +2. 同一個標記下傳產生的新標記都屬於原來那一類。 +3. 對於一次區間加減操作,對於線段樹的任何一類,如果它被修改區間完全包含或者和修改區間完全相離,那麼這一類就不變;否則我們就讓這一類分裂成兩類:一類是被修改的部分,一類是剩下的部分。 + +重新定義每一類標記的權值等於這一類標記在線段樹上所有節點形成的虛樹大小(不包含根節點),定義輔助函數 \\( \Phi(x) \\) 為線段樹中所有標記類的權值總和。 + +這樣一次區間加減操作對輔助函數的影響只有單次 \\( O(logn) \\) 的標記下傳(分裂標記時勢能函數只會減少);一次標記下傳只會讓輔助函數增加 \\( O(1) \\);一次打標記只會讓輔助函數增加 \\( O(logn) \\)。 + +考慮 DFS 的過程,我們先透過線段樹定位數個節點,然後從這些節點開始 DFS。我們對每一個開始節點考慮每一類會被回收的標記:如果這一類標記只有一部分在這個子樹中,那麼我們每經過一個節點都會讓這個標記的權值減一;而如果這一類標記全部都在子樹中,回收的過程相當於先花一些代價定位這一類標記的 LCA,然後再在標記的虛數上進行回收。 + +所以我們可以將複雜度分成兩部分,第一部分昰減少輔助函數時花費的時間複雜度,這是 \\( O(mlogn) \\) 的;第二部分的複雜度是定位某一類標記的 LCA 時產生的複雜度,每一類標記都有可能對這一部分的複雜度產生 \\( O(mlogn) \\) 的貢獻,因為標記的總數只有 \\( O(mlogn) \\),所以標記的類數也是 \\( O(mlogn) \\)的,因此這一部分的複雜度的一個上界是 \\( O(mlogn) \\)。 + +至此,我們證明了這一個算法的複雜度的上界是 \\( O(mlogn) \\)。實際上這個上界是比較鬆的,吉如一老師猜想標記的總類數是線性的,即這一個算法的時間複雜度是 \\( O(mlogn) \\) 的,然而到目前為止還沒有好的方法可以證明。 + +觀察例題 \\( 2 \\) 的時間複雜度證明,我們發現在證明時並沒有使用到區間加減操作的具體性質,所以將區間加減操作替換成其他的修改操作,上述的證明仍然成立。 + +
Solution Code + +```cpp +#include + +#define NS (500005) +#define LS(a) (a << 1) +#define RS(a) (a << 1 | 1) + +using namespace std; + +typedef long long LL; + +template inline void IN(_Tp& dig) { + char c; bool flag = 0; dig = 0; + while (c = getchar(), !isdigit(c)) if (c == '-') flag = 1; + while (isdigit(c)) dig = dig * 10 + c - '0', c = getchar(); + if (flag) dig = -dig; +} + +int n, m, A[NS]; + +struct N {LL m1, m2, sum, tag; int cnt;} e[NS << 2]; + +void tmin(int a, LL d) { + e[a].sum -= 1ll * (e[a].m1 - d) * e[a].cnt, e[a].m1 = d; +} + +void tadd(int a, int l, LL d) { + e[a].m1 += d, e[a].m2 += d; + e[a].sum += 1ll * l * d, e[a].tag += d; +} + +void pup(int a) { + int l = LS(a), r = RS(a); + e[a].sum = e[l].sum + e[r].sum; + if (e[l].m1 == e[r].m1) { + e[a].m1 = e[l].m1, e[a].cnt = e[l].cnt + e[r].cnt; + e[a].m2 = max(e[l].m2, e[r].m2); + return; + } + if (e[l].m1 < e[r].m1) swap(l, r); + e[a].m1 = e[l].m1, e[a].cnt = e[l].cnt, e[a].m2 = max(e[r].m1, e[l].m2); +} + +void pdown(int L, int R, int a) { + int l = LS(a), r = RS(a); + if (e[a].tag) { + int Mid = (L + R) >> 1; + tadd(l, Mid - L + 1, e[a].tag), tadd(r, R - Mid, e[a].tag); + e[a].tag = 0; + } + if (e[a].m1 < e[l].m1) tmin(l, e[a].m1); + if (e[a].m1 < e[r].m1) tmin(r, e[a].m1); +} + +void Build(int l, int r, int a) { + if (l == r) { + e[a].sum = e[a].m1 = A[l], e[a].m2 = -1e17, e[a].cnt = 1; + return; + } + int mid = (l + r) >> 1; + Build(l, mid, LS(a)), Build(mid + 1, r, RS(a)), pup(a); +} + +void Up_Min(int l, int r, int d, int L, int R, int a) { + if (d >= e[a].m1) return; + if (l <= L && R <= r && d > e[a].m2) {tmin(a, d); return;} + pdown(L, R, a); + int Mid = (L + R) >> 1; + if (l <= Mid) Up_Min(l, r, d, L, Mid, LS(a)); + if (r > Mid) Up_Min(l, r, d, Mid + 1, R, RS(a)); + pup(a); +} + +void Up_Add(int l, int r, int d, int L, int R, int a) { + if (l <= L && R <= r) {tadd(a, R - L + 1, d); return;} + pdown(L, R, a); + int Mid = (L + R) >> 1; + if (l <= Mid) Up_Add(l, r, d, L, Mid, LS(a)); + if (r > Mid) Up_Add(l, r, d, Mid + 1, R, RS(a)); + pup(a); +} + +LL Query(int l, int r, int L, int R, int a) { + if (l <= L && R <= r) return e[a].sum; + pdown(L, R, a); + LL res = 0; int Mid = (L + R) >> 1; + if (l <= Mid) res = Query(l, r, L, Mid, LS(a)); + if (r > Mid) res += Query(l, r, Mid + 1, R, RS(a)); + return res; +} + +int main() { + IN(n), IN(m); + for (int i = 1; i <= n; i += 1) IN(A[i]); + Build(1, n, 1); + for (int C = 1, o, a, b, c; C <= m; C += 1) + { + IN(o), IN(a), IN(b); + if (o == 1) IN(c), Up_Min(a, b, c, 1, n, 1); + else if (o == 2) IN(c), Up_Add(a, b, c, 1, n, 1); + else printf("%lld\n", Query(a, b, 1, n, 1)); + } + return 0; +} +``` + +
+ +### 將區間最值操作轉換為區間加減操作 + +觀察我們在例題 \\( 2 \\) 使用的算法,我們發現在打上區間取 \\( min \\) 標記時,這一個區間只有最大值會受到這一個標記的影響,而其他數都維持不變。同時在最大值被修改之後,原來昰最大值的所有數依然還昰區間最大值,原來不是區間最大值的所有數依然不是區間最大值。 + +我們可以把線段樹中的每一個節點所維護的區間分成兩類,一類是這個區間中的最大值,一類是這個區間中的其他數。區間最大值標記只會打在 \\( mx2 < v < mx1 \\) 的節點上,可以看成只針對最大值的加減操作;而區間加操作對這兩類值都生效。在標記下傳時,需要根據兩個子節點的最大值情況進行討論,最大值的標記只能下傳到最大值較大的子節點中(兩子節點最大值相同時同時下傳)。 + +至此,我們得到了以一個 \\( log \\) 的代價,將區間最值操作轉化為區間加減操作的方法。 + +> 例題 3. [BZOJ - 最假女選手](https://darkbzoj.tk/problem/4695) +> +> 給一個長度為 \\( n \\) 的序列 \\( a \\),並對其進行 \\( m \\) 筆操作。操作有六種: +> +> 1. 給定 \\( l, r, k \\),對所有 \\( i, (l \leq i \leq r) \\),將\\( a_i \\)加上 \\( k \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( a_i \\) 修改成 \\( max(a_i, x) \\)。 +> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( a_i \\) 修改成 \\( min(a_i, x) \\)。 +> 4. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( \sum_{i = l}^{r} a_i \\)。 +> 5. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( a_i \\)的最大值。 +> 6. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( a_i \\)的最小值。 +> +> - \\( n, m \leq 5 \times 10^5 \\) +> - \\( | a_i | \leq 10^8 \\) + +我們將一個區間的節點劃分為最大值、最小值和其他值三種。在每個節點維護區間和 \\( sum \\)、區間最大值 \\( mx1 \\)、次大值 \\( mx2 \\)、最大個數 \\( cmx \\)、最小值 \\( mn1 \\)、次小值 \\( mn2 \\)、最小個數 \\( cmn \\)。我們還需要維護區間 \\( max \\)、區間 \\( min \\)、區間加的標記。我們採用這樣的策略: + +1. 我們認為區間加的標記是最優先的,其他兩種標記地位相等。 +2. 對一個節點加上一個 \\( k \\) 標記,除了用 \\( k \\) 更新最大值、最小值和其他值,我們用這個 \\( k \\) 更新區間 \\( max \\)、區間 \\( min \\)、區間加的標記。 +3. 對於區間取 \\( min \\) 操作,在線段樹上暴力搜尋找到 \\( mx2 < k < mx1 \\) 的節點,這些節點的區間最大值都應改成 \\( k \\),只對最大值加上 \\( k - mx1 \\) 即可。 +4. 區間取 \\( max \\) 操作同理。 + +另外,如果一個區間的值域很小(只有 \\( 1 \\) 個數或 \\( 2 \\) 個數),可能會發生一個值既是最大值又是次小值的情況,也就是發生了數域的重合。這種情況要特判,分辨到底該被哪個標記作用。 + +
Solution Code + +```cpp +#include +#include +using namespace std; + +int rd() { + char act = 0; + int f = 1, x = 0; + while (act = getchar(), act < '0' && act != '-'); + if (act == '-') f = -1, act = getchar(); + x = act - '0'; + while (act = getchar(), act >= '0') x = x * 10 + act - '0'; + return x * f; +} + +const int N = 5e5 + 5, SZ = N << 2, INF = 0x7fffffff; + +int n, m; +int a[N]; + +struct data { + int mx, mx2, mn, mn2, cmx, cmn, tmx, tmn, tad; + long long sum; +} t[SZ]; + +void pushup(int u) { + const int lu = u << 1, ru = u << 1 | 1; + t[u].sum = t[lu].sum + t[ru].sum; + if (t[lu].mx == t[ru].mx) { + t[u].mx = t[lu].mx, t[u].cmx = t[lu].cmx + t[ru].cmx; + t[u].mx2 = max(t[lu].mx2, t[ru].mx2); + } else if (t[lu].mx > t[ru].mx) { + t[u].mx = t[lu].mx, t[u].cmx = t[lu].cmx; + t[u].mx2 = max(t[lu].mx2, t[ru].mx); + } else { + t[u].mx = t[ru].mx, t[u].cmx = t[ru].cmx; + t[u].mx2 = max(t[lu].mx, t[ru].mx2); + } + if (t[lu].mn == t[ru].mn) { + t[u].mn = t[lu].mn, t[u].cmn = t[lu].cmn + t[ru].cmn; + t[u].mn2 = min(t[lu].mn2, t[ru].mn2); + } else if (t[lu].mn < t[ru].mn) { + t[u].mn = t[lu].mn, t[u].cmn = t[lu].cmn; + t[u].mn2 = min(t[lu].mn2, t[ru].mn); + } else { + t[u].mn = t[ru].mn, t[u].cmn = t[ru].cmn; + t[u].mn2 = min(t[lu].mn, t[ru].mn2); + } +} + +void push_add(int u, int l, int r, int v) { + // 更新加法標記的同时,更新 \\( min \\) 和 \\( max \\) 標記 + t[u].sum += (r - l + 1ll) * v; + t[u].mx += v, t[u].mn += v; + if (t[u].mx2 != -INF) t[u].mx2 += v; + if (t[u].mn2 != INF) t[u].mn2 += v; + if (t[u].tmx != -INF) t[u].tmx += v; + if (t[u].tmn != INF) t[u].tmn += v; + t[u].tad += v; +} + +void push_min(int u, int tg) { + // 注意比較 \\( max \\) 標記 + if (t[u].mx <= tg) return; + t[u].sum += (tg * 1ll - t[u].mx) * t[u].cmx; + if (t[u].mn2 == t[u].mx) t[u].mn2 = tg; + if (t[u].mn == t[u].mx) t[u].mn = tg; + if (t[u].tmx > tg) t[u].tmx = tg; // 更新取 \\( max \\) 標記 + t[u].mx = tg, t[u].tmn = tg; +} + +void push_max(int u, int tg) { + if (t[u].mn > tg) return; + t[u].sum += (tg * 1ll - t[u].mn) * t[u].cmn; + if (t[u].mx2 == t[u].mn) t[u].mx2 = tg; + if (t[u].mx == t[u].mn) t[u].mx = tg; + if (t[u].tmn < tg) t[u].tmn = tg; + t[u].mn = tg, t[u].tmx = tg; +} + +void pushdown(int u, int l, int r) { + const int lu = u << 1, ru = u << 1 | 1, mid = (l + r) >> 1; + if (t[u].tad) + push_add(lu, l, mid, t[u].tad), push_add(ru, mid + 1, r, t[u].tad); + if (t[u].tmx != -INF) push_max(lu, t[u].tmx), push_max(ru, t[u].tmx); + if (t[u].tmn != INF) push_min(lu, t[u].tmn), push_min(ru, t[u].tmn); + t[u].tad = 0, t[u].tmx = -INF, t[u].tmn = INF; +} + +void build(int u = 1, int l = 1, int r = n) { + t[u].tmn = INF, t[u].tmx = -INF; // 取極限 + if (l == r) { + t[u].sum = t[u].mx = t[u].mn = a[l]; + t[u].mx2 = -INF, t[u].mn2 = INF; + t[u].cmx = t[u].cmn = 1; + return; + } + int mid = (l + r) >> 1; + build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); + pushup(u); +} + +void add(int L, int R, int v, int u = 1, int l = 1, int r = n) { + if (R < l || r < L) return; + if (L <= l && r <= R) return push_add(u, l, r, v); + int mid = (l + r) >> 1; + pushdown(u, l, r); + add(L, R, v, u << 1, l, mid), add(L, R, v, u << 1 | 1, mid + 1, r); + pushup(u); +} + +void tomin(int L, int R, int v, int u = 1, int l = 1, int r = n) { + if (R < l || r < L || t[u].mx <= v) return; + if (L <= l && r <= R && t[u].mx2 < v) return push_min(u, v); + int mid = (l + r) >> 1; + pushdown(u, l, r); + tomin(L, R, v, u << 1, l, mid), tomin(L, R, v, u << 1 | 1, mid + 1, r); + pushup(u); +} + +void tomax(int L, int R, int v, int u = 1, int l = 1, int r = n) { + if (R < l || r < L || t[u].mn >= v) return; + if (L <= l && r <= R && t[u].mn2 > v) return push_max(u, v); + int mid = (l + r) >> 1; + pushdown(u, l, r); + tomax(L, R, v, u << 1, l, mid), tomax(L, R, v, u << 1 | 1, mid + 1, r); + pushup(u); +} + +long long qsum(int L, int R, int u = 1, int l = 1, int r = n) { + if (R < l || r < L) return 0; + if (L <= l && r <= R) return t[u].sum; + int mid = (l + r) >> 1; + pushdown(u, l, r); + return qsum(L, R, u << 1, l, mid) + qsum(L, R, u << 1 | 1, mid + 1, r); +} + +long long qmax(int L, int R, int u = 1, int l = 1, int r = n) { + if (R < l || r < L) return -INF; + if (L <= l && r <= R) return t[u].mx; + int mid = (l + r) >> 1; + pushdown(u, l, r); + return max(qmax(L, R, u << 1, l, mid), qmax(L, R, u << 1 | 1, mid + 1, r)); +} + +long long qmin(int L, int R, int u = 1, int l = 1, int r = n) { + if (R < l || r < L) return INF; + if (L <= l && r <= R) return t[u].mn; + int mid = (l + r) >> 1; + pushdown(u, l, r); + return min(qmin(L, R, u << 1, l, mid), qmin(L, R, u << 1 | 1, mid + 1, r)); +} + +int main() { + n = rd(); + for (int i = 1; i <= n; i++) a[i] = rd(); + build(); + m = rd(); + for (int i = 1; i <= m; i++) { + int op, l, r, x; + op = rd(), l = rd(), r = rd(); + if (op <= 3) x = rd(); + if (op == 1) + add(l, r, x); + else if (op == 2) + tomax(l, r, x); + else if (op == 3) + tomin(l, r, x); + else if (op == 4) + printf("%lld\n", qsum(l, r)); + else if (op == 5) + printf("%lld\n", qmax(l, r)); + else + printf("%lld\n", qmin(l, r)); + } + return 0; +} +``` + +
+ +### 歷史最值問題 + +## Exercises + +> [Codeforces 438D The Child and Sequence](https://codeforces.com/contest/438/problem/D) +> 給定一個序列 \\( a_i \\),並對其進行 \\( m \\) 筆操作。操作有三種: +> +> 1. 給定 \\( l, r \\),請輸出區間總和 \\( a[l]+...+a[r] \\) +> 2. 給定 \\( l, r \\),對區間 \\( [l, r] \\) 的每一個數取模,即 \\( a_i = a_i mod x \\) +> 3. 給定 \\( k, x \\),將 \\( a[k] \\) 的值改為 \\( x \\) + +我們在這題只需要總和 \\( sum \\)、最大值\\( max \\)。`update_mod` 處理操作 \\( 2 \\),`update_set` 處理操作 \\( 3 \\)。 + +因為操作 \\( 3 \\) 只更改 \\( a[k] \\) 的值,`update_set` 可以進一步優化為判斷 \\( k \\) 與當前節點區間中點位置 \\( tm \\) 的大小關係,如果 \\( k \\) 小於等於 \\( tm \\),只更新左子節點。否則只更新右子節點。 + +```cpp +#include +using namespace std; +using ll = long long; + +const int MAXN = 100001; + +int N; +ll a[MAXN]; + +struct node { + ll sum; // 總和 + ll max; // 最大值 +} T[MAXN * 4]; + +void merge(int t) { + T[t].sum = T[t << 1].sum + T[t << 1 | 1].sum; + T[t].max = max(T[t << 1].max, T[t << 1 | 1].max); +} + +void build(int t = 1, int tl = 0, int tr = N - 1) { + if (tl == tr) { + T[t].sum = T[t].max = a[tl]; + return; + } + int tm = (tl + tr) >> 1; + build(t << 1, tl, tm); + build(t << 1 | 1, tm + 1, tr); + merge(t); +} + +void update_mod(int l, int r, ll v, int t = 1, int tl = 1, int tr = N) { + if (r < tl || tr < l || v > T[t].max) { return; } + if (tl == tr) { + int val = T[t].max % v; + T[t].sum = T[t].max = val; + return; + } + int tm = (tl + tr) / 2; + update_mod(l, r, v, t * 2, tl, tm); + update_mod(l, r, v, t * 2 + 1, tm + 1, tr); + merge(t); +} + +void update_set(int k, ll v, int t = 1, int tl = 1, int tr = N) { + if(r < tl || tr < l) { return; } + if(tl == tr) { + T[t].sum = T[t].max = v; + return; + } + int tm = (tl + tr) / 2; + if(k <= tm) { + update_set(k, v, t * 2, tl, tm); + } else { + update_set(k, v, t * 2 + 1, tm + 1, tr); + } + merge(t); +} + +ll query(int l, int r, int t = 1, int tl = 1, int tr = N) { + if(r < tl || tr < l) { return 0; } + if(l <= tl && tr <= r) { return T[t].sum; } + int tm = (tl + tr) / 2; + return query(l, r, t * 2, tl, tm) + + query(l, r, t * 2 + 1, tm + 1, tr); +} + +int main() { + int Q; + cin >> N >> Q; + for (int i = 1; i <= N; i++) { cin >> a[i]; } + build(); + while(Q--) { + int t; + cin >> t; + if (t == 1) { + int l, r; + cin >> l >> r; + cout << query(l, r) << '\n'; + } else if (t == 2) { + int l, r; + ll x; + cin >> l >> r >> x; + update_mod(l, r, x); + } else if (t == 3) { + int k; + ll x; + cin >> k >> x; + update_set(k, x); + } + } +} +``` + +> [洛谷 P6242【模板】線段樹 3](https://www.luogu.com.cn/problem/P6242) +> +> 給定一個序列 \\( A_i \\)、輔助序列 \\( B_i \\),並對其進行 \\( m \\) 筆操作。操作有三種: +> +> 1. 給定 \\( l, r, k \\),對區間\\( [l, r] \\)的每一個數加上 \\( k \\),即 \\( A_i = A_i + k \\) +> 2. 給定 \\( l, r, v \\),對區間 \\( [l, r] \\) 的每一個數取最小值,即\\( A_i = min(A_i, v) \\) +> 3. 給定 \\( l, r \\),請輸出區間總和\\( a[l]+...+a[r] \\) +> 4. 給定 \\( k, x \\),對於區間 \\( [l, r] \\) 的每個 \\( i \\),請輸出 \\( A_i \\) 的最大值 +> 5. 給定 \\( l, r \\),對於區間 \\( [l, r] \\) 的每個 \\( i \\),請輸出 \\( B_i \\) 的最大值 +> +> 每次操作後,將 \\( B_i \\) 設為 \\( max($B_i$, $A_i$) \\) +> +> - \\( 1 \leq n, m \leq 5 \times 10^5 \\) +> - \\( -5 \times 10^8 \leq A_i \leq 5 \times 10^8 \\) +> - \\( -2000 \leq k \leq 2000 \\) +> - \\( -5 \times 10^8 \leq v \leq 5 \times 10^8 \\) + +```cpp +#include +using namespace std; +using ll = long long; + +const int N = 200021; +int n, m, A[N]; + +struct SegmentTreeBeats { + struct node { + int mx_a, smx, cnt, mx_b; + ll sum, add_a1, add_a2, add_b1, add_b2; + } t[N<<2]; + + void pushup(int x) { + t[x].mx_a = max(t[x*2].mx_a, t[x*2+1].mx_a); + t[x].mx_b = max(t[x*2].mx_b, t[x*2+1].mx_b); + t[x].sum = t[x*2].sum + t[x*2+1].sum; + if(t[x*2].mx_a == t[x*2+1].mx_a) t[x].smx = max(t[x*2].smx, t[x*2+1].smx); + else if(t[x*2].mx_a > t[x*2+1].mx_a) t[x].smx = max(t[x*2].smx, t[x*2+1].mx_a); + else t[x].smx = max(t[x*2].mx_a, t[x*2+1].smx); + t[x].cnt = (t[x*2].mx_a >= t[x*2+1].mx_a) * t[x*2].cnt + (t[x*2+1].mx_a >= t[x*2].mx_a) * t[x*2+1].cnt; + } + + void addtag(int x, int l, int r, ll A, ll b, ll c, ll d) { + t[x].sum += A*t[x].cnt + c*(r-l+1-t[x].cnt); + t[x].mx_b = max((ll)t[x].mx_b, t[x].mx_a + b); + t[x].add_b1 = max(t[x].add_b1, t[x].add_a1 + b); + t[x].add_b2 = max(t[x].add_b2, t[x].add_a2 + d); + t[x].mx_a += A, t[x].add_a1 += A, t[x].add_a2 += c; + if(t[x].smx > -Inf) t[x].smx += c; + } + + void pushdown(int x, int l, int r) { + int mid = (l+r)>>1, mx = max(t[x*2].mx_a, t[x*2+1].mx_a); + ll add_a1 = t[x].add_a1, add_a2 = t[x].add_a2, add_b1 = t[x].add_b1, add_b2 = t[x].add_b2; + if(t[x*2].mx_a == mx) addtag(x*2, l, mid, add_a1, add_b1, add_a2, add_b2); + else addtag(x*2, l, mid, add_a2, add_b2, add_a2, add_b2); + if(t[x*2+1].mx_a == mx) addtag(x*2+1, mid+1, r, add_a1, add_b1, add_a2, add_b2); + else addtag(x*2+1, mid+1, r, add_a2, add_b2, add_a2, add_b2); + t[x].add_a1 = t[x].add_b1 = t[x].add_a2 = t[x].add_b2 = 0; + } + + void build(int x, int l, int r) { + if(l == r){ + t[x].sum = t[x].mx_a = t[x].mx_b = A[l]; + t[x].smx = -Inf, t[x].cnt = 1; + return; + } + int mid = (l+r)>>1; + build(x*2, l, mid), build(x*2+1, mid+1, r); + pushup(x); + } + + void update_add(int x, int l, int r, int L, int R, int k) { + if(l >= L && r <= R){ addtag(x, l, r, k, k, k, k); return; } + int mid = (l+r)>>1; + pushdown(x, l, r); + if(mid >= L) update_add(x*2, l, mid, L, R, k); + if(mid < R) update_add(x*2+1, mid+1, r, L, R, k); + pushup(x); + } + + void update_min(int x, int l, int r, int L, int R, int val) { + if(t[x].mx_a <= val) return; + if(l >= L && r <= R && t[x].smx < val){ addtag(x, l, r, val-t[x].mx_a, val-t[x].mx_a, 0, 0); return; } + int mid = (l+r)>>1; + pushdown(x, l, r); + if(mid >= L) update_min(x*2, l, mid, L, R, val); + if(mid < R) update_min(x*2+1, mid+1, r, L, R, val); + pushup(x); + } + + ll query(int x, int l, int r, int L, int R, int id) { + if(l >= L && r <= R) return id == 1 ? t[x].sum : (id == 2 ? t[x].mx_a : t[x].mx_b); + int mid = (l+r)>>1; + pushdown(x, l, r); + ll A = (mid >= L) ? query(x*2, l, mid, L, R, id) : (id == 1 ? 0 : -Inf); + ll b = (mid < R) ? query(x*2+1, mid+1, r, L, R, id) : (id == 1 ? 0 : -Inf); + return (id == 1 ? A+b : max(A, b)); + } +} T; + +int main() { + cin>>n>>m; + for(int i = 1; i <= n; i++) cin>>A[i]; + T.build(1, 1, n); + int type, l, r, k; + while(m--) { + cin>>type>>l>>r; + if(type == 1) { + cin>>k, T.update_add(1, 1, n, l, r, k); + } else if(type == 2) { + cin>>k, T.update_min(1, 1, n, l, r, k); + } else { + cout<< T.query(1, 1, n, l, r, type-2) < [Codeforces 1290E Cartesian Tree](https://codeforces.com/problemset/problem/1290/E) +> +> 給定一個長度為 \\( n \\) 的序列\\( a_i \\),對於區間 \\( [1, n] \\) 的每個 \\( k \\),用前\\( k \\) 小的值建造笛卡爾樹,求所有子樹大小的總和。 +> +> - \\( 1 \leq n \leq 150000 \\) + +\\( l_i, r_i \\) 分別為 \\( a_i \\) 左右最後一個比其小的數的位置,節點 \\( i \\) 的子樹大小為 \\( r_i - l_i + 1 \\)。分開維護 \\( l_i \\) 和 \\( r_i \\),以 \\( r_i \\) 為例,當 \\( k \\) 增加 \\ ( 1 \\),\\( k+1 \\) 插入序列時,\\( pos_{k+1} \\) 左側的 \\( r_i \\) 被更新成 \\( min(r_i, pos_{k+1}) \\),右側的 \\( r_i \\) 被更新成 \\( r_i+1 \\)。可以使用 STB 維護區間總和。 + +時間複雜度是\\( O(nlog^2n) \\)。 + +```cpp +#include +using namespace std; +using ll = long long; + +const int N = 160000; + +int n; +int a[N], pos[N]; + +struct STB { + struct node { + ll sum; + ll max1, max2, cnt, num, tag = -1; + ll lazy; + } T[N<<2]; + + void merge(int t) { + T[t].max1 = max(T[t*2].max1, T[t*2+1].max1); + T[t].num = T[t*2].num + T[t*2+1].num; + T[t].sum = T[t*2].sum + T[t*2+1].sum; + if(T[t*2].max1 == T[t*2+1].max1) { + T[t].max2 = max(T[t*2].max2, T[t*2+1].max2); + } + else if(T[t*2].max1 > T[t*2+1].max1) { + T[t].max2 = max(T[t*2].max2, T[t*2+1].max1); + } + else { + T[t].max2 = max(T[t*2].max1, T[t*2+1].max2); + } + T[t].cnt = (T[t*2].max1 >= T[t*2+1].max1) * T[t*2].cnt + (T[t*2+1].max1 >= T[t*2].max1) * T[t*2+1].cnt; + } + + void push_add(int t, int k) { + T[t].sum += (ll)k * T[t].num; + if(T[t].num) { + T[t].max1 += k; + T[t].lazy += k; + if(T[t].max2 > 0) T[t].max2 += k; + if(~T[t].tag) T[t].tag += k; + } + } + + void push_min(int t, int k) { + if(T[t].max1 <= k) { return; } + T[t].sum -= (ll)T[t].cnt * (T[t].max1 - k); + T[t].max1 = k; + T[t].tag = k; + } + + void push_down(int t) { + if(T[t].lazy) { + push_add(t*2, T[t].lazy); + push_add(t*2+1, T[t].lazy); + } + if(~T[t].tag) { + push_min(t*2, T[t].tag); + push_min(t*2+1, T[t].tag); + } + T[t].tag = -1, T[t].lazy = 0; + } + + void insert(int t, int tl, int tr, int pos, int val) { + if(tl == tr) { + T[t].sum = T[t].max1 = val; + T[t].cnt = T[t].num = 1; + return; + } + int tm = (tl+tr)>>1; + push_down(t); + if(tm >= pos) insert(t*2, tl, tm, pos, val); + else insert(t*2+1, tm+1, tr, pos, val); + merge(t); + } + + void update(int l, int r, int k, int id, int t = 1, int tl = 1, int tr = n) { + if(l > r) return; + if(id && T[t].max1 <= k) return; + if(l <= tl && tr <= r){ + if(id && T[t].max2 < k) { + push_min(t, k); + return; + } + if(!id) { + push_add(t, k); + return; + } + } + int tm = (tl+tr)>>1; + push_down(t); + if(tm >= l) update(l, r, k, id, t*2, tl, tm); + if(tm < r) update(l, r, k, id, t*2+1, tm+1, tr); + merge(t); + } +} LB, RB; + +struct Fenwick { + int t[N]; + void update(int pos, int k) { + while(pos <= n) t[pos] += k, pos += (pos&-pos); + } + int get(int pos) { + int ret = 0; + while(pos) ret += t[pos], pos -= (pos&-pos); + return ret; + } +} T; + +int main() { + cin>>n; + for(int i = 1; i <= N; i++) cin>>a[i], pos[a[i]] = i; + + for(int i = 1; i <= N; i++) { + RB.update(pos[i]+1, n, 1, 0); + RB.update(1, pos[i]-1, T.get(pos[i]), 1); + LB.update(1, n-pos[i]+1, -1, 0); + LB.update(1, n-pos[i]+1, n-T.get(pos[i])-1, 1); + RB.insert(1, 1, n, pos[i], i); + LB.insert(1, 1, n, n-pos[i]+1, n); + cout<< RB.T[1].sum - ((ll)i*(n+1) - LB.T[1].sum) + i <<"\n"; + T.update(pos[i], 1); + } +} +``` + +> [Codeforces 1572F Stations](https://codeforces.com/problemset/problem/1572/F) +> +> 給定 \\( n \\) 座城市,每座城市有 \\( 2 \\) 個屬性 \\( h_i, w_i \\),第 \\( i \\) 座城市可以向第 \\( j \\) 座城市廣播,如果對於所有的 \\( k \\) 在區間 \\( [i, j] \\) 中,滿足 \\( max{h_k} < h_i\\)。一開始 \\( h_i = 0 \\) 且 \\( w_i = i \\)。 +> +> 其發生 \\( q \\) 次事件,事件有 \\( 2 \\) 種: +> +> 1. 給定 \\( c_i, g_i \\),將城市 \\( c_i \\) 的 \\( h \\) 變成全局嚴格最大值,並修改其 \\( w \\) 為 \\( g_i \\) +> 2. 給定 \\( l_i, r_i \\),請輸出區間 \\( [l_i, r_i] \\) 的每座城市可以覆蓋到的城市數量 \\( b_i \\) 之總和 +> +> - \\( 1 \leq n \leq 200000 \\) + +每個城市覆蓋的區域是一個從 \\( i \\) 開始的區間,而維護區間右端點是一個單點修改,區間取 \\( min \\) 問題,另外用一棵線段樹維護區間覆蓋,因為 STB 裡可直接對值進行修改,所以修改時可以順帶在另一棵線段樹上進行區間修改,即打\\( tag \\) 時維護即可。詢問時直接在線段樹查詢區間和。 + +時間複雜度是 \\( O(nlog^2n) \\)。 + +```cpp +#include +using namespace std; +using ll = long long; + +const int N = 200021; + +int n, q; + +struct SegmentTree{ + struct node { + ll sum; + ll lazy; + } t[N<<2]; + + void push_down(int x, int l, int r) { + int mid = (l+r)>>1; + t[x*2].sum += (mid-l+1) * t[x].lazy, t[x*2].lazy += t[x].lazy; + t[x*2+1].sum += (r-mid) * t[x].lazy, t[x*2+1].lazy += t[x].lazy; + t[x].lazy = 0; + } + + void update(int x, int l, int r, int L, int R, ll k) { + if(L > R) return; + if(l >= L && r <= R){ t[x].sum += (r-l+1) * k, t[x].lazy += k; return; } + int mid = (l+r)>>1; + push_down(x, l, r); + if(mid >= L) update(x*2, l, mid, L, R, k); + if(mid < R) update(x*2+1, mid+1, r, L, R, k); + t[x].sum = t[x*2].sum + t[x*2+1].sum; + } + + ll get(int x, int l, int r, int L, int R) { + if(l >= L && r <= R) return t[x].sum; + int mid = (l+r)>>1; ll ret = 0; + push_down(x, l, r); + if(mid >= L) ret += get(x*2, l, mid, L, R); + if(mid < R) ret += get(x*2+1, mid+1, r, L, R); + return ret; + } +} BIT; + +struct Segment_Tree_Beats { + struct node { + int mx, smx, cnt, tag = -1; + } t[N<<2]; + + void push_up(int x) { + t[x].mx = max(t[x*2].mx, t[x*2+1].mx); + if(t[x*2].mx == t[x*2+1].mx) t[x].smx = max(t[x*2].smx, t[x*2+1].smx); + else if(t[x*2].mx > t[x*2+1].mx) t[x].smx = max(t[x*2].smx, t[x*2+1].mx); + else t[x].smx = max(t[x*2].mx, t[x*2+1].smx); + t[x].cnt = (t[x*2].mx >= t[x*2+1].mx) * t[x*2].cnt + (t[x*2+1].mx >= t[x*2].mx) * t[x*2+1].cnt; + } + + void addtag(int x, int k, bool frt) { + if(t[x].mx <= k) return; + if(frt) BIT.update(1, 1, n, k+1, t[x].mx, -t[x].cnt); + t[x].mx = t[x].tag = k; + } + + void push_down(int x){ + if(~t[x].tag) + addtag(x*2, t[x].tag, 0), addtag(x*2+1, t[x].tag, 0); + t[x].tag = -1; + } + + void insert(int x, int l, int r, int pos, int val){ + if(l == r){ + BIT.update(1, 1, n, l, t[x].mx, -t[x].cnt), BIT.update(1, 1, n, l, val, 1); + t[x].mx = val, t[x].cnt = 1; return; + } + int mid = (l+r)>>1; + push_down(x); + if(mid >= pos) insert(x*2, l, mid, pos, val); + else insert(x*2+1, mid+1, r, pos, val); + push_up(x); + } + + void update(int x, int l, int r, int L, int R, int k) { + if(t[x].mx <= k || L > R) return; + if(l >= L && r <= R && t[x].smx < k){ addtag(x, k, 1); return; } + int mid = (l+r)>>1; + push_down(x); + if(mid >= L) update(x*2, l, mid, L, R, k); + if(mid < R) update(x*2+1, mid+1, r, L, R, k); + push_up(x); + } +} T; + +int main() { + cin>>n>>q; + for(int i = 1; i <= n; i++) T.insert(1, 1, n, i, i); + int type, c, g, l, r; + while(q--) { + cin>>type; + if(type == 1) { + cin>>c>>g; + T.insert(1, 1, n, c, g), T.update(1, 1, n, 1, c-1, c-1); + } else cin>>l>>r, cout<< BIT.get(1, 1, n, l, r) <<"\n"; + } +} +``` + +## References + +底下的資源包含許多例題,同學可以去參考看看。 + +- [A simple introduction to "Segment tree beats"](https://codeforces.com/blog/entry/57319) +- [Segment Tree Beats - USACO Guide](https://usaco.guide/adv/segtree-beats?lang=cpp) +- [Segment Tree Beats 学习笔记](https://www.cnblogs.com/Neal-lee/p/15695984.html) +- [Historic Information on Segment Trees](https://mzhang2021.github.io/cp-blog/historic-segtree) +- [《区间最值操作与历史最值问题》- 国家集训队 2016 论文集](https://github.com/enkerewpo/OI-Public-Library/blob/master/IOI中国国家候选队论文/国家集训队2016论文集.pdf) + +[^note-1]: [2016 集训队论文 - 吉如一《区间最值操作与历史最值问题》](http://www.doc88.com/p-6744902151779.html) diff --git a/src/others/segment_tree_beats.md b/src/others/segment_tree_beats.md deleted file mode 100644 index 1642591b..00000000 --- a/src/others/segment_tree_beats.md +++ /dev/null @@ -1,782 +0,0 @@ -# Introduction to Segment Tree Beats -## 前言 -Segment Tree Beats(簡稱STB)是改良版本的線段樹,可以解決提升線段樹的效率。STB進行區間查詢和區間修改等基本操作時,可在保持時間複雜度不變的情況下,簡化不必要的操作。 -## 建造樹節點 -STB的每一個節點劃分成 -* 總和(sum) -* 最大值(max1)、次大值(max2)、最大值次數(maxc) -* 最小值(min1)、次小值(min2)、最小值次數(minc) -* 懶惰標記(lazy) -```cpp -using ll = long long; -ll A[MAXN]; -struct node { - ll sum; // 總和 - ll max1; // 最大值 - ll max2; // 次大值 - ll maxc; // 最大值次數 - ll min1; // 最小值 - ll min2; // 次小值 - ll minc; // 最小值次數 - ll lazy; // 懶惰標記 -} T[MAXN * 4]; -``` -## 建造STB -對root進行呼叫,不斷對兩個子節點進行呼叫,達成遞迴建樹。當左右邊界相等,表示當前節點為葉節點,總和(sum)、最大值(max1)、最小值(min1)是節點本身的值。
-時間複雜度是$O(n)$。 -```cpp -// 節點t的區間範圍是[tl, tr] -void build(int t = 1, int tl = 0, int tr = N - 1) { - T[t].lazy = 0; - if(tl == tr) { - T[t].sum = T[t].max1 = T[t].min1 = A[tl]; - T[t].maxc = T[t].minc = 1; - T[t].max2 = -llINF; - T[t].min2 = llINF; - return; - } - int tm = (tl + tr) >> 1; - build(t << 1, tl, tm); - build(t << 1 | 1, tm + 1, tr); - merge(t); -} -``` -## 區間修改 -Update函數主要是針對一段目標範圍,進行區間修改。由Push函數更新子節點的數值。 -按照不同功能,劃分成 -* update_add / push_add -* update_max / push_max -* update_min / push_min -* push_down -### update_add -對目標區間[l, r]所有數值都增加v。假設目標區間範圍是[l, r],變化值是v,當前節點的區間範圍是[tl, tr]。 -* 如果節點區間完全不在目標區間內,就不需要更新。 -* 如果節點區間完全在目標區間內,直接對當前節點進行push_add操作。 -* 否則不斷對兩個子節點進行更新操作,最後用兩個子節點的數值更新當前節點的數值。 -```cpp -const ll llINF = LLONG_MAX; -// 目標區間範圍是[l, r],變化值是v,節點t的區間範圍是[tl, tr] -void update_add(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) { - if(r < tl || tr < l) { return; } - if(l <= tl && tr <= r) { - push_add(t, tl, tr, v); - return; - } - push_down(t, tl, tr); - int tm = (tl + tr) >> 1; - update_add(l, r, v, t << 1, tl, tm); - update_add(l, r, v, t << 1 | 1, tm + 1, tr); - merge(t); -} -``` -### push_add -對一段範圍加上一常數時,更新子節點的數值。假設節點t的區間範圍是[tl, tr],變化值是v。如果變化值為0,就不需要更新。從l到r每個元素都增加v,所以sum會增加(r - l + 1) * v。最大值、最小值、懶惰標記直接增加v。次大值、次小值則需要先判斷存在,再增加v。 -```cpp -// 節點t的區間範圍是[tl, tr],變化值是v -void push_add(int t, int tl, int tr, ll v) { - if(v == 0) { return; } - T[t].sum += (tr - tl + 1) * v; - T[t].max1 += v; - if(T[t].max2 != -llINF) { T[t].max2 += v; } - T[t].min1 += v; - if(T[t].min2 != llINF) { T[t].min2 += v; } - T[t].lazy += v; -} -``` -### update_max -對目標區間[l, r]所有比v大的值都替換為v。假設目標區間範圍是[l, r],更新值是v,當前節點的區間範圍是[tl, tr]。 -* 如果節點區間完全不在目標區間內,或更新值大於等於最大值(max1),就不需要更新。 -* 如果節點區間完全在目標區間內,且次大值(max2)小於更新值,直接對當前節點進行push_max操作。 -* 否則不斷對兩個子節點進行更新操作,最後用兩個子節點的數值更新當前節點的數值。 -```cpp -// 目標區間範圍是[l, r],更新值是v,節點t的區間範圍是[tl, tr] -void update_max(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) { - if(r < tl || tr < l || v >= T[t].max1) { return; } - if(l <= tl && tr <= r && v > T[t].max2) { - push_max(t, v, tl == tr); - return; - } - push_down(t, tl, tr); - int tm = (tl + tr) >> 1; - update_max(l, r, v, t << 1, tl, tm); - update_max(l, r, v, t << 1 | 1, tm + 1, tr); - merge(t); -} -``` -### push_max -更新子節點的最大值。假設節點t的更新值是v,l代表是否為葉節點。如果更新值大於等於最大值(max1),就不需要更新。將最大值更新為v,所以先從sum扣除本來的max1 * maxc,再增加v * maxc。接著處理最小值、次小值。如果當前節點是葉節點,最小值直接設為v。否則更新最小值、次小值。 -```cpp -// 節點t的更新值是v,l代表是否為葉節點,l是true表示當前節點是葉節點 -void push_max(int t, ll v, bool l) { - if(v >= T[t].max1) { return; } - T[t].sum -= T[t].max1 * T[t].maxc; - T[t].max1 = v; - T[t].sum += T[t].max1 * T[t].maxc; - if(l) { - T[t].min1 = T[t].max1; - } else { - if(v <= T[t].min1) { - T[t].min1 = v; - } else if(v < T[t].min2) { - T[t].min2 = v; - } - } -} -``` -### update_min -對目標區間[l, r]所有比v小的值都替換為v。假設目標區間範圍是[l, r],更新值是v,當前節點的區間範圍是[tl, tr]。 -* 如果節點區間完全不在目標區間內,或更新值小於等於最小值(min1),就不需要更新。 -* 如果節點區間完全在目標區間內,且次小值(min2)大於更新值,直接對當前節點進行push_min操作。 -* 否則不斷對兩個子節點進行更新操作,最後用兩個子節點的數值更新當前節點的數值。 -```cpp -// 目標區間範圍是[l, r],更新值是v,節點t的區間範圍是[tl, tr] -void update_min(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) { - if(r < tl || tr < l || v <= T[t].min1) { return; } - if(l <= tl && tr <= r && v < T[t].min2) { - push_min(t, v, tl == tr); - return; - } - push_down(t, tl, tr); - int tm = (tl + tr) >> 1; - update_min(l, r, v, t << 1, tl, tm); - update_min(l, r, v, t << 1 | 1, tm + 1, tr); - merge(t); -} -``` -### push_min -更新子節點的最小值。假設節點t的更新值是v,l代表是否為葉節點。如果更新值小於等於最小值(min1),就不需要更新。將最小值更新為v,所以先從sum扣除本來的min1 * minc,再增加v * minc。接著處理最大值、次大值。如果當前節點是葉節點,最大值直接設為v。否則更新最小值、次小值。 -```cpp -// 節點t的更新值是v,l代表是否為葉節點,l是true表示當前節點是葉節點 -void push_min(int t, ll v, bool l) { - if (v <= T[t].min1) { return; } - T[t].sum -= T[t].min1 * T[t].minc; - T[t].min1 = v; - T[t].sum += T[t].min1 * T[t].minc; - if(l) { - T[t].max1 = T[t].min1; - } else { - if(v >= T[t].max1) { - T[t].max1 = v; - } else if(v > T[t].max2) { - T[t].max2 = v; - } - } -} -``` -### push_down -對一段範圍進行區間操作時,將當前節點的懶惰標記(lazy)、最大值(max1)、最小值(min1)向下更新到子節點。假設節點t的區間範圍是[tl, tr]。如果當前節點是葉節點,就不需要向下更新。 -```cpp -// 節點t的區間範圍是[tl, tr] -void push_down(int t, int tl, int tr) { - if(tl == tr) return; - - int tm = (tl + tr) >> 1; - push_add(t << 1, tl, tm, T[t].lazy); - push_add(t << 1 | 1, tm + 1, tr, T[t].lazy); - T[t].lazy = 0; - - push_max(t << 1, T[t].max1, tl == tm); - push_max(t << 1 | 1, T[t].max1, tm + 1 == tr); - - push_min(t << 1, T[t].min1, tl == tm); - push_min(t << 1 | 1, T[t].min1, tm + 1 == tr); -} -``` -## Merge函數 -整合兩個子節點的數值,更新當前節點的數值。劃分成3個部分分別處理總和、最大值、最小值。 -* 總和為左子節點總和加上右子節點總和。 -* 如果左右子節點最大值相同,最大值為左子節點最大值(max1),次大值為左右子節點次大值較大者,最大值次數為左右子節點最大值次數(maxc)相加。如果左子節點最大值較大,最大值為左子節點最大值,次大值為max(左子節點次大值, 右子節點最大值),最大值次數為左子節點最大值次數。如果右子節點最大值較大,最大值為右子節點最大值,次大值為max(左子節點最大值, 右子節點次大值),最大值次數為右子節點最大值次數。 -* 如果左右子節點最小值相同,最小值為左子節點最小值(min1),次小值為左右子節點次小值較小者,最小值次數為左右子節點最小值次數(minc)相加。如果左子節點最小值較小,最小值為左子節點最小值,次大值為min(左子節點次小值, 右子節點最小值),最小值次數為左子節點最小值次數。如果右子節點最小值較小,最小值為右子節點最小值,次小值為min(左子節點最小值, 右子節點次小值),最小值次數為右子節點最小值次數。 -```cpp -// 節點t -void merge(int t) { - - T[t].sum = T[t << 1].sum + T[t << 1 | 1].sum; - - if (T[t << 1].max1 == T[t << 1 | 1].max1) { - T[t].max1 = T[t << 1].max1; - T[t].max2 = max(T[t << 1].max2, T[t << 1 | 1].max2); - T[t].maxc = T[t << 1].maxc + T[t << 1 | 1].maxc; - } else { - if (T[t << 1].max1 > T[t << 1 | 1].max1) { - T[t].max1 = T[t << 1].max1; - T[t].max2 = max(T[t << 1].max2, T[t << 1 | 1].max1); - T[t].maxc = T[t << 1].maxc; - } else { - T[t].max1 = T[t << 1 | 1].max1; - T[t].max2 = max(T[t << 1].max1, T[t << 1 | 1].max2); - T[t].maxc = T[t << 1 | 1].maxc; - } - } - - if (T[t << 1].min1 == T[t << 1 | 1].min1) { - T[t].min1 = T[t << 1].min1; - T[t].min2 = min(T[t << 1].min2, T[t << 1 | 1].min2); - T[t].minc = T[t << 1].minc + T[t << 1 | 1].minc; - } else { - if (T[t << 1].min1 < T[t << 1 | 1].min1) { - T[t].min1 = T[t << 1].min1; - T[t].min2 = min(T[t << 1].min2, T[t << 1 | 1].min1); - T[t].minc = T[t << 1].minc; - } else { - T[t].min1 = T[t << 1 | 1].min1; - T[t].min2 = min(T[t << 1].min1, T[t << 1 | 1].min2); - T[t].minc = T[t << 1 | 1].minc; - } - } -} -``` -## 區間查詢 -對一段範圍進行區間總和查詢。假設目標區間範圍是[l, r],節點t的區間範圍是[tl, tr]。 -* 如果節點區間完全不在目標區間內,就回傳0。 -* 如果節點區間完全在目標區間內,直接回傳當前節點總和(sum)。 -* 否則將當前節點的懶惰標記(lazy)、最大值(max1)、最小值(min1)向下更新到子節點,接著不斷對兩個子節點進行區間查詢總和,最後用兩個子節點的總和作為查詢的答案。 -```cpp -// 目標區間範圍是[l, r],節點t的區間範圍是[tl, tr] -ll query_sum(int l, int r, int t = 1, int tl = 0, int tr = N - 1) { - if (r < tl || tr < l) { return 0; } - if (l <= tl && tr <= r) { return T[t].sum; } - push_down(t, tl, tr); - int tm = (tl + tr) >> 1; - return query_sum(l, r, t << 1, tl, tm) + - query_sum(l, r, t << 1 | 1, tm + 1, tr); -} -``` -# Basic Segment Tree Beats Problems -## RMQ -要進行區間最大值查詢,將query_sum改成return T[t].max1即可。 -```cpp -// 目標區間範圍是[l, r],節點t的區間範圍是[tl, tr] -ll query_max(int l, int r, int t = 1, int tl = 0, int tr = N - 1) { - if (r < tl || tr < l) { return 0; } - if (l <= tl && tr <= r) { return T[t].max1; } - push_down(t, tl, tr); - int tm = (tl + tr) >> 1; - return query_max(l, r, t << 1, tl, tm) + - query_max(l, r, t << 1 | 1, tm + 1, tr); -} -``` -## For all i in [l, r], change $A_i$ to $x$ -對一段範圍進行區間修改。 -* 如果節點區間完全不在目標區間內,就不需要更新。 -* 如果節點區間完全在目標區間內,直接將節點的總和(sum)、最大值(max1)設為v。 -* 不斷對兩個子節點進行更新操作,最後用兩個子節點的數值更新當前節點的數值。 -```cpp -void update_set(int l, int r, ll v = x, int t = 1, int tl = 1, int tr = N) { - if (r < tl || tr < l) { return; } - if (tl == tr) { - T[t].sum = T[t].max = v; - return; - } - int tm = (tl + tr) / 2; - update_mod(l, r, v, t * 2, tl, tm); - update_mod(l, r, v, t * 2 + 1, tm + 1, tr); - merge(t); -} -``` -## For all i in [l, r], change $A_i$ to $A_i$ + $x$ -跟上一題一樣,差在更新的方式是T[t].sum += v、T[t].max += v。 -```cpp -void update_set(int k, ll v = x, int t = 1, int tl = 1, int tr = N) { - if(r < tl || tr < l) { return; } - if(tl == tr) { - T[t].sum += v; - T[t].max += v; - return; - } - int tm = (tl + tr) / 2; - if(k <= tm) { - update_set(k, v, t * 2, tl, tm); - } else { - update_set(k, v, t * 2 + 1, tm + 1, tr); - } - merge(t); -} -``` -## For all i in [l, r], change $A_i$ to max($A_i$ - $x$, 0) -跟上一題一樣,差在更新的方式是T[t].sum = max(T[t].sum - v, 0)、T[t].max = max(T[t].max - v, 0); -
-Solution -```cpp -void update_set(int k, ll v = x, int t = 1, int tl = 1, int tr = N) { - if(r < tl || tr < l) { return; } - if(tl == tr) { - T[t].sum = max(T[t].sum - v, 0); - T[t].max = max(T[t].max - v, 0); - return; - } - int tm = (tl + tr) / 2; - if(k <= tm) { - update_set(k, v, t * 2, tl, tm); - } else { - update_set(k, v, t * 2 + 1, tm + 1, tr); - } - merge(t); -} -``` -
- -## [Codeforces 438D The Child and Sequence][1] -[1]: https://codeforces.com/contest/438/problem/D -給定一個序列$a_i$,並對其進行$m$筆操作。操作有3種: -1. 給定l, r,請輸出區間總和a[l]+...+a[r] -2. 給定l, r, 對區間[l, r]的每一個數取模,即$a_i$ = $a_i$ $mod$ $x$ -3. 給定k, x,將a[k]的值改為x - -我們在這題只需要總和(sum)、最大值(max)。 -update_mod處理操作2,update_set處理操作3。 -因為操作3只更改a[k]的值,update_set可以進一步優化為判斷k與當前節點區間中點位置tm的大小關係,如果k小於等於tm,只更新左子節點。否則只更新右子節點。 -```cpp -#include -using namespace std; -using ll = long long; - -const int MAXN = 100001; - -int N; -ll a[MAXN]; - -struct node { - ll sum; // 總和 - ll max; // 最大值 -} T[MAXN * 4]; - -void merge(int t) { - T[t].sum = T[t << 1].sum + T[t << 1 | 1].sum; - T[t].max = max(T[t << 1].max, T[t << 1 | 1].max); -} - -void build(int t = 1, int tl = 0, int tr = N - 1) { - if (tl == tr) { - T[t].sum = T[t].max = a[tl]; - return; - } - int tm = (tl + tr) >> 1; - build(t << 1, tl, tm); - build(t << 1 | 1, tm + 1, tr); - merge(t); -} - -void update_mod(int l, int r, ll v, int t = 1, int tl = 1, int tr = N) { - if (r < tl || tr < l || v > T[t].max) { return; } - if (tl == tr) { - int val = T[t].max % v; - T[t].sum = T[t].max = val; - return; - } - int tm = (tl + tr) / 2; - update_mod(l, r, v, t * 2, tl, tm); - update_mod(l, r, v, t * 2 + 1, tm + 1, tr); - merge(t); -} - -void update_set(int k, ll v, int t = 1, int tl = 1, int tr = N) { - if(r < tl || tr < l) { return; } - if(tl == tr) { - T[t].sum = T[t].max = v; - return; - } - int tm = (tl + tr) / 2; - if(k <= tm) { - update_set(k, v, t * 2, tl, tm); - } else { - update_set(k, v, t * 2 + 1, tm + 1, tr); - } - merge(t); -} - -ll query(int l, int r, int t = 1, int tl = 1, int tr = N) { - if(r < tl || tr < l) { return 0; } - if(l <= tl && tr <= r) { return T[t].sum; } - int tm = (tl + tr) / 2; - return query(l, r, t * 2, tl, tm) + - query(l, r, t * 2 + 1, tm + 1, tr); -} - -int main() { - int Q; - cin >> N >> Q; - for (int i = 1; i <= N; i++) { cin >> a[i]; } - build(); - while(Q--) { - int t; - cin >> t; - if (t == 1) { - int l, r; - cin >> l >> r; - cout << query(l, r) << '\n'; - } else if (t == 2) { - int l, r; - ll x; - cin >> l >> r >> x; - update_mod(l, r, x); - } else if (t == 3) { - int k; - ll x; - cin >> k >> x; - update_set(k, x); - } - } -} -``` -# Advanced Segment Tree Beats Problems -## [洛谷P6242 【模板】線段樹 3][2] -[2]: https://www.luogu.com.cn/problem/P6242 -給定一個序列$A_i$、輔助序列$B_i$,並對其進行$m$筆操作。操作有3種: -1. 給定l, r, k,對區間[l, r]的每一個數加上k,即$A_i$ = $A_i$ + $k$ -2. 給定l, r, v, 對區間[l, r]的每一個數取最小值,即$A_i$ = min($A_i$, $v$) -3. 給定l, r, 請輸出區間總和a[l]+...+a[r] -4. 給定k, x,對於區間[l, r]的每個i,請輸出$A_i$的最大值 -5. 給定l, r,對於區間[l, r]的每個i,請輸出$B_i$的最大值 -每次操作後,將$B_i$設為max($B_i$, $A_i$) -* 1 $\leq$ n, m $\leq$ 500000 -```cpp -#include -using namespace std; -using ll = long long; - -const int N = 200021; -int n, m, A[N]; - -struct SegmentTreeBeats { - struct node { - int mx_a, smx, cnt, mx_b; - ll sum, add_a1, add_a2, add_b1, add_b2; - } t[N<<2]; - - void pushup(int x) { - t[x].mx_a = max(t[x*2].mx_a, t[x*2+1].mx_a); - t[x].mx_b = max(t[x*2].mx_b, t[x*2+1].mx_b); - t[x].sum = t[x*2].sum + t[x*2+1].sum; - if(t[x*2].mx_a == t[x*2+1].mx_a) t[x].smx = max(t[x*2].smx, t[x*2+1].smx); - else if(t[x*2].mx_a > t[x*2+1].mx_a) t[x].smx = max(t[x*2].smx, t[x*2+1].mx_a); - else t[x].smx = max(t[x*2].mx_a, t[x*2+1].smx); - t[x].cnt = (t[x*2].mx_a >= t[x*2+1].mx_a) * t[x*2].cnt + (t[x*2+1].mx_a >= t[x*2].mx_a) * t[x*2+1].cnt; - } - - void addtag(int x, int l, int r, ll A, ll b, ll c, ll d) { - t[x].sum += A*t[x].cnt + c*(r-l+1-t[x].cnt); - t[x].mx_b = max((ll)t[x].mx_b, t[x].mx_a + b); - t[x].add_b1 = max(t[x].add_b1, t[x].add_a1 + b); - t[x].add_b2 = max(t[x].add_b2, t[x].add_a2 + d); - t[x].mx_a += A, t[x].add_a1 += A, t[x].add_a2 += c; - if(t[x].smx > -Inf) t[x].smx += c; - } - - void pushdown(int x, int l, int r) { - int mid = (l+r)>>1, mx = max(t[x*2].mx_a, t[x*2+1].mx_a); - ll add_a1 = t[x].add_a1, add_a2 = t[x].add_a2, add_b1 = t[x].add_b1, add_b2 = t[x].add_b2; - if(t[x*2].mx_a == mx) addtag(x*2, l, mid, add_a1, add_b1, add_a2, add_b2); - else addtag(x*2, l, mid, add_a2, add_b2, add_a2, add_b2); - if(t[x*2+1].mx_a == mx) addtag(x*2+1, mid+1, r, add_a1, add_b1, add_a2, add_b2); - else addtag(x*2+1, mid+1, r, add_a2, add_b2, add_a2, add_b2); - t[x].add_a1 = t[x].add_b1 = t[x].add_a2 = t[x].add_b2 = 0; - } - - void build(int x, int l, int r) { - if(l == r){ - t[x].sum = t[x].mx_a = t[x].mx_b = A[l]; - t[x].smx = -Inf, t[x].cnt = 1; - return; - } - int mid = (l+r)>>1; - build(x*2, l, mid), build(x*2+1, mid+1, r); - pushup(x); - } - - void update_add(int x, int l, int r, int L, int R, int k) { - if(l >= L && r <= R){ addtag(x, l, r, k, k, k, k); return; } - int mid = (l+r)>>1; - pushdown(x, l, r); - if(mid >= L) update_add(x*2, l, mid, L, R, k); - if(mid < R) update_add(x*2+1, mid+1, r, L, R, k); - pushup(x); - } - - void update_min(int x, int l, int r, int L, int R, int val) { - if(t[x].mx_a <= val) return; - if(l >= L && r <= R && t[x].smx < val){ addtag(x, l, r, val-t[x].mx_a, val-t[x].mx_a, 0, 0); return; } - int mid = (l+r)>>1; - pushdown(x, l, r); - if(mid >= L) update_min(x*2, l, mid, L, R, val); - if(mid < R) update_min(x*2+1, mid+1, r, L, R, val); - pushup(x); - } - - ll query(int x, int l, int r, int L, int R, int id) { - if(l >= L && r <= R) return id == 1 ? t[x].sum : (id == 2 ? t[x].mx_a : t[x].mx_b); - int mid = (l+r)>>1; - pushdown(x, l, r); - ll A = (mid >= L) ? query(x*2, l, mid, L, R, id) : (id == 1 ? 0 : -Inf); - ll b = (mid < R) ? query(x*2+1, mid+1, r, L, R, id) : (id == 1 ? 0 : -Inf); - return (id == 1 ? A+b : max(A, b)); - } -} T; - -int main() { - cin>>n>>m; - for(int i = 1; i <= n; i++) cin>>A[i]; - T.build(1, 1, n); - int type, l, r, k; - while(m--) { - cin>>type>>l>>r; - if(type == 1) { - cin>>k, T.update_add(1, 1, n, l, r, k); - } else if(type == 2) { - cin>>k, T.update_min(1, 1, n, l, r, k); - } else { - cout<< T.query(1, 1, n, l, r, type-2) < -時間複雜度是$O(nlog^2n)$。 -```cpp -#include -using namespace std; -using ll = long long; - -const int N = 160000; - -int n; -int a[N], pos[N]; - -struct STB { - struct node { - ll sum; - ll max1, max2, cnt, num, tag = -1; - ll lazy; - } T[N<<2]; - - void merge(int t) { - T[t].max1 = max(T[t*2].max1, T[t*2+1].max1); - T[t].num = T[t*2].num + T[t*2+1].num; - T[t].sum = T[t*2].sum + T[t*2+1].sum; - if(T[t*2].max1 == T[t*2+1].max1) { - T[t].max2 = max(T[t*2].max2, T[t*2+1].max2); - } - else if(T[t*2].max1 > T[t*2+1].max1) { - T[t].max2 = max(T[t*2].max2, T[t*2+1].max1); - } - else { - T[t].max2 = max(T[t*2].max1, T[t*2+1].max2); - } - T[t].cnt = (T[t*2].max1 >= T[t*2+1].max1) * T[t*2].cnt + (T[t*2+1].max1 >= T[t*2].max1) * T[t*2+1].cnt; - } - - void push_add(int t, int k) { - T[t].sum += (ll)k * T[t].num; - if(T[t].num) { - T[t].max1 += k; - T[t].lazy += k; - if(T[t].max2 > 0) T[t].max2 += k; - if(~T[t].tag) T[t].tag += k; - } - } - - void push_min(int t, int k) { - if(T[t].max1 <= k) { return; } - T[t].sum -= (ll)T[t].cnt * (T[t].max1 - k); - T[t].max1 = k; - T[t].tag = k; - } - - void push_down(int t) { - if(T[t].lazy) { - push_add(t*2, T[t].lazy); - push_add(t*2+1, T[t].lazy); - } - if(~T[t].tag) { - push_min(t*2, T[t].tag); - push_min(t*2+1, T[t].tag); - } - T[t].tag = -1, T[t].lazy = 0; - } - - void insert(int t, int tl, int tr, int pos, int val) { - if(tl == tr) { - T[t].sum = T[t].max1 = val; - T[t].cnt = T[t].num = 1; - return; - } - int tm = (tl+tr)>>1; - push_down(t); - if(tm >= pos) insert(t*2, tl, tm, pos, val); - else insert(t*2+1, tm+1, tr, pos, val); - merge(t); - } - - void update(int l, int r, int k, int id, int t = 1, int tl = 1, int tr = n) { - if(l > r) return; - if(id && T[t].max1 <= k) return; - if(l <= tl && tr <= r){ - if(id && T[t].max2 < k) { - push_min(t, k); - return; - } - if(!id) { - push_add(t, k); - return; - } - } - int tm = (tl+tr)>>1; - push_down(t); - if(tm >= l) update(l, r, k, id, t*2, tl, tm); - if(tm < r) update(l, r, k, id, t*2+1, tm+1, tr); - merge(t); - } -} LB, RB; - -struct Fenwick { - int t[N]; - void update(int pos, int k) { - while(pos <= n) t[pos] += k, pos += (pos&-pos); - } - int get(int pos) { - int ret = 0; - while(pos) ret += t[pos], pos -= (pos&-pos); - return ret; - } -} T; - -int main() { - cin>>n; - for(int i = 1; i <= N; i++) cin>>a[i], pos[a[i]] = i; - - for(int i = 1; i <= N; i++) { - RB.update(pos[i]+1, n, 1, 0); - RB.update(1, pos[i]-1, T.get(pos[i]), 1); - LB.update(1, n-pos[i]+1, -1, 0); - LB.update(1, n-pos[i]+1, n-T.get(pos[i])-1, 1); - RB.insert(1, 1, n, pos[i], i); - LB.insert(1, 1, n, n-pos[i]+1, n); - cout<< RB.T[1].sum - ((ll)i*(n+1) - LB.T[1].sum) + i <<"\n"; - T.update(pos[i], 1); - } -} -``` -## [Codeforces 1572F Stations][4] -[4]: https://codeforces.com/problemset/problem/1572/F -給定n座城市,每座城市有2個屬性$h_i$, $w_i$,第i座城市可以向第j座城市廣播,如果對於所有的k在區間[i, j]中,滿足max{$h_k$} < $h_i$。一開始$h_i$ = 0且$w_i$ = i。 -其發生q次事件,事件有2種: -1. 給定$c_i$, $g_i$, 將城市$c_i$的h變成全局嚴格最大值,並修改其w為$g_i$ -2. 給定$l_i$, $r_i$, 請輸出區間[$l_i$, $r_i$]的每座城市可以覆蓋到的城市數量$b_i$之總和 -* 1 $\leq$ n $\leq$ 200000 - -每個城市覆蓋的區域是一個從i開始的區間,而維護區間右端點是一個單點修改,區間取min問題,另外用一棵線段樹維護區間覆蓋,因為STB裡可直接對值進行修改,所以修改時可以順帶在另一棵線段樹上進行區間修改,即打tag時維護即可。詢問時直接在線段樹查詢區間和。 -時間複雜度是$O(nlog^2n)$。 -```cpp -#include -using namespace std; -using ll = long long; - -const int N = 200021; - -int n, q; - -struct SegmentTree{ - struct node { - ll sum; - ll lazy; - } t[N<<2]; - - void push_down(int x, int l, int r) { - int mid = (l+r)>>1; - t[x*2].sum += (mid-l+1) * t[x].lazy, t[x*2].lazy += t[x].lazy; - t[x*2+1].sum += (r-mid) * t[x].lazy, t[x*2+1].lazy += t[x].lazy; - t[x].lazy = 0; - } - - void update(int x, int l, int r, int L, int R, ll k) { - if(L > R) return; - if(l >= L && r <= R){ t[x].sum += (r-l+1) * k, t[x].lazy += k; return; } - int mid = (l+r)>>1; - push_down(x, l, r); - if(mid >= L) update(x*2, l, mid, L, R, k); - if(mid < R) update(x*2+1, mid+1, r, L, R, k); - t[x].sum = t[x*2].sum + t[x*2+1].sum; - } - - ll get(int x, int l, int r, int L, int R) { - if(l >= L && r <= R) return t[x].sum; - int mid = (l+r)>>1; ll ret = 0; - push_down(x, l, r); - if(mid >= L) ret += get(x*2, l, mid, L, R); - if(mid < R) ret += get(x*2+1, mid+1, r, L, R); - return ret; - } -} BIT; - -struct Segment_Tree_Beats { - struct node { - int mx, smx, cnt, tag = -1; - } t[N<<2]; - - void push_up(int x) { - t[x].mx = max(t[x*2].mx, t[x*2+1].mx); - if(t[x*2].mx == t[x*2+1].mx) t[x].smx = max(t[x*2].smx, t[x*2+1].smx); - else if(t[x*2].mx > t[x*2+1].mx) t[x].smx = max(t[x*2].smx, t[x*2+1].mx); - else t[x].smx = max(t[x*2].mx, t[x*2+1].smx); - t[x].cnt = (t[x*2].mx >= t[x*2+1].mx) * t[x*2].cnt + (t[x*2+1].mx >= t[x*2].mx) * t[x*2+1].cnt; - } - - void addtag(int x, int k, bool frt) { - if(t[x].mx <= k) return; - if(frt) BIT.update(1, 1, n, k+1, t[x].mx, -t[x].cnt); - t[x].mx = t[x].tag = k; - } - - void push_down(int x){ - if(~t[x].tag) - addtag(x*2, t[x].tag, 0), addtag(x*2+1, t[x].tag, 0); - t[x].tag = -1; - } - - void insert(int x, int l, int r, int pos, int val){ - if(l == r){ - BIT.update(1, 1, n, l, t[x].mx, -t[x].cnt), BIT.update(1, 1, n, l, val, 1); - t[x].mx = val, t[x].cnt = 1; return; - } - int mid = (l+r)>>1; - push_down(x); - if(mid >= pos) insert(x*2, l, mid, pos, val); - else insert(x*2+1, mid+1, r, pos, val); - push_up(x); - } - - void update(int x, int l, int r, int L, int R, int k) { - if(t[x].mx <= k || L > R) return; - if(l >= L && r <= R && t[x].smx < k){ addtag(x, k, 1); return; } - int mid = (l+r)>>1; - push_down(x); - if(mid >= L) update(x*2, l, mid, L, R, k); - if(mid < R) update(x*2+1, mid+1, r, L, R, k); - push_up(x); - } -} T; - -int main() { - cin>>n>>q; - for(int i = 1; i <= n; i++) T.insert(1, 1, n, i, i); - int type, c, g, l, r; - while(q--) { - cin>>type; - if(type == 1) { - cin>>c>>g; - T.insert(1, 1, n, c, g), T.update(1, 1, n, 1, c-1, c-1); - } else cin>>l>>r, cout<< BIT.get(1, 1, n, l, r) <<"\n"; - } -} -``` -# Reference -* https://codeforces.com/blog/entry/57319 -* https://usaco.guide/adv/segtree-beats?lang=cpp -* https://www.cnblogs.com/Neal-lee/p/15695984.html -* https://mzhang2021.github.io/cp-blog/historic-segtree \ No newline at end of file From d819d5f17a43867254eb8c1508c86616dad02fcf Mon Sep 17 00:00:00 2001 From: 110034024 Date: Wed, 14 Jun 2023 23:32:09 +0800 Subject: [PATCH 3/7] revise summary --- src/SUMMARY.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 52466089..81933652 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -10,24 +10,24 @@ - [Basic Greedy](greedy/basic.md) - [Dynamic Programming]() - [Basic DP]() +- [Flow]() - [Data Structure](data_structure/intro.md) - [Segment Tree Beats](data_structure/segment_tree_beats.md) -- [Flow]() - [Sqrt Technique](sqrt/intro.md) - [Square Root Decomposition](sqrt/sqrt_decomposition.md) - [Sqrt-Related Observation]() - [Mo's Algorithm]() - [Mathematics](math/intro.md) - - [Introduction to Arithmetic Function](math/introduction_to_arithmetic_function.md) - - [Linear Sieve](math/linear_sieve.md) - - [數論分塊](math/sqrt_decomposition.md) - - [杜教篩](math/du_sieve.md) - - [Revisit Arithmetic Function](math/revisit_arithmetic_function.md) + - [Arithmetic Function](math/introduction_to_arithmetic_function.md) + - [Linear Sieve](math/linear_sieve.md) + - [數論分塊](math/sqrt_decomposition.md) + - [杜教篩](math/du_sieve.md) + - [Arithmetic Function Revisit](math/revisit_arithmetic_function.md) - [Miscellaneous]() +- [C++ Programming Tips]() --- -- [C++ Programming Tips]() - [Make a Codebook](others/codebook.md) - [Useful Resources](others/useful_resources.md) - [CSES Problem Tag]() From c7c60f57b0d2f6b30b9411bf60e184da0054fdd9 Mon Sep 17 00:00:00 2001 From: 110034024 Date: Thu, 15 Jun 2023 13:21:29 +0800 Subject: [PATCH 4/7] add historical --- .../image/segment_tree_beats/merge_tag.png | Bin 0 -> 53648 bytes src/data_structure/segment_tree_beats.md | 509 +++++++++++++++++- 2 files changed, 493 insertions(+), 16 deletions(-) create mode 100644 src/data_structure/image/segment_tree_beats/merge_tag.png diff --git a/src/data_structure/image/segment_tree_beats/merge_tag.png b/src/data_structure/image/segment_tree_beats/merge_tag.png new file mode 100644 index 0000000000000000000000000000000000000000..b36edc3ff08aa89a274a48fb5117725f5b8f5609 GIT binary patch literal 53648 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℘%`TTDUSKh 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 BaVr1- literal 0 HcmV?d00001 diff --git a/src/data_structure/segment_tree_beats.md b/src/data_structure/segment_tree_beats.md index d2c3b3d3..fa65d993 100644 --- a/src/data_structure/segment_tree_beats.md +++ b/src/data_structure/segment_tree_beats.md @@ -8,11 +8,11 @@ Segment Tree Beats(簡稱 STB)是北京大學的吉如一提出的概念, > 例題 1. [HDU - Gorgeous Sequence](http://acm.hdu.edu.cn/showproblem.php?pid=5306) > -> 給一個長度為 \\( n \\) 的序列 \\( a \\),並對其進行 \\( m \\) 筆操作。操作有三種: +> 給一個長度為 \\( n \\) 的序列 \\( A \\),並對其進行 \\( m \\) 筆操作。操作有三種: > -> 1. 給定 \\( l, r, x \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( a_i \\) 修改成 \\( min(a_i, x) \\)。 -> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( a_i \\)的最大值。 -> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( \sum_{i = l}^{r} a_i \\)。 +> 1. 給定 \\( l, r, x \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( A_i \\) 修改成 \\( min(A_i, x) \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( A_i \\)的最大值。 +> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( \sum_{i = l}^{r} A_i \\)。 > > - \\( n, m \leq 10^6 \\) @@ -190,11 +190,11 @@ signed main() { > 例題 2. Picks loves segment tree > -> 給一個長度為 \\( n \\) 的序列 \\( a \\),並對其進行 \\( m \\) 筆操作。操作有三種: +> 給一個長度為 \\( n \\) 的序列 \\( A \\),並對其進行 \\( m \\) 筆操作。操作有三種: > -> 1. 給定 \\( l, r, x \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( a_i \\) 修改成 \\( min(a_i, x) \\)。 -> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將\\( a_i \\) 加上 \\( x \\)(\\( x \\) 可能為負數)。 -> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( \sum_{i = l}^{r} a_i \\)。 +> 1. 給定 \\( l, r, x \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( A_i \\) 修改成 \\( min(A_i, x) \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將\\( A_i \\) 加上 \\( x \\)(\\( x \\) 可能為負數)。 +> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( \sum_{i = l}^{r} A_i \\)。 > > - \\( n, m \leq 3 \times 10^5 \\) @@ -340,17 +340,17 @@ int main() { > 例題 3. [BZOJ - 最假女選手](https://darkbzoj.tk/problem/4695) > -> 給一個長度為 \\( n \\) 的序列 \\( a \\),並對其進行 \\( m \\) 筆操作。操作有六種: +> 給一個長度為 \\( n \\) 的序列 \\( A \\),並對其進行 \\( m \\) 筆操作。操作有六種: > -> 1. 給定 \\( l, r, k \\),對所有 \\( i, (l \leq i \leq r) \\),將\\( a_i \\)加上 \\( k \\)。 -> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( a_i \\) 修改成 \\( max(a_i, x) \\)。 -> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( a_i \\) 修改成 \\( min(a_i, x) \\)。 -> 4. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( \sum_{i = l}^{r} a_i \\)。 -> 5. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( a_i \\)的最大值。 -> 6. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出\\( a_i \\)的最小值。 +> 1. 給定 \\( l, r, k \\),對所有 \\( i, (l \leq i \leq r) \\),將\\( A_i \\)加上 \\( k \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( A_i \\) 修改成 \\( max(A_i, x) \\)。 +> 3. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),將 \\( A_i \\) 修改成 \\( min(A_i, x) \\)。 +> 4. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出 \\( \sum_{i = l}^{r} A_i \\)。 +> 5. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出 \\( A_i \\) 的最大值。 +> 6. 給定 \\( l, r \\),對所有 \\( i, (l \leq i \leq r) \\),輸出 \\( A_i \\) 的最小值。 > > - \\( n, m \leq 5 \times 10^5 \\) -> - \\( | a_i | \leq 10^8 \\) +> - \\( | A_i | \leq 10^8 \\) 我們將一個區間的節點劃分為最大值、最小值和其他值三種。在每個節點維護區間和 \\( sum \\)、區間最大值 \\( mx1 \\)、次大值 \\( mx2 \\)、最大個數 \\( cmx \\)、最小值 \\( mn1 \\)、次小值 \\( mn2 \\)、最小個數 \\( cmn \\)。我們還需要維護區間 \\( max \\)、區間 \\( min \\)、區間加的標記。我們採用這樣的策略: @@ -546,6 +546,483 @@ int main() { ### 歷史最值問題 +在資料結構問題中,我們通常需要對一個給定的數組 \\( A \\) 進行多次操作,然後進行一些詢問。有一少部分問題需要對歷史版本進行詢問,這類特殊的有關歷史版本的問題我們把它稱作歷史最值問題。歷史最值問題中的詢問可以分成以下三類: + +#### 歷史最大值 + +當前位置下曾經出現過的數的最大值。定義一個輔助數組 \\( B \\),最開始 \\( B \\) 數組與 \\( A \\) 數組完全相同。在每一次操作後,對每一個 \\( i \in [1, n] \\),我們都進行一次更新,讓 \\( B_i = max(B_i, A_i) \\)。這時,我們將 \\( B_i \\) 稱作 \\( i \\) 這個位置的歷史最大值。 + +#### 歷史最小值 + +當前位置下曾經出現過的數的最小值。定義一個輔助數組 \\( B \\),最開始 \\( B \\) 數組與 \\( A \\) 數組完全相同。在每一次操作後,對每一個 \\( i \in [1, n] \\),我們都進行一次更新,讓 \\( B_i = min(B_i, A_i) \\)。這時,我們將 \\( B_i \\) 稱作 \\( i \\) 這個位置的歷史最小值。 + +#### 歷史版本和 + +定義一個輔助數組 \\( B \\),最開始 \\( B \\) 數組中的所有數都是 \\( 0 \\)。在每一次操作後,對每一個 \\( i \in [1, n] \\),我們都進行一次更新,讓 \\( B_i \\) 加上 \\( A_i \\)。這時,我們將 \\( B_i \\) 稱作 \\( i \\) 這個位置的歷史版本和。 + +接下來,我們將歷史最值問題按照難度從低到高分成四類進行討論。 + +### 可以用懶標記處理的問題 + +> 例題 4. [Tyvj - CPU 監控](http://www.tyvj.cn/p/1518) +> +> 給一個長度為 \\( n \\) 的序列 \\( A \\),同時定義一個輔助數組 \\( B \\),\\( B \\)開始與 \\( A \\) 完全相同。接下來對其進行 \\( m \\) 筆操作,操作有四種: +> +> 1. 給定 \\( l, r, x \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 修改成 \\( x \\)。 +> 2. 給定 \\( l, r, x \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 加上 \\( x \\)。 +> 3. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),輸出 \\( A_i \\) 的最大值。 +> 4. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),輸出 \\( B_i \\) 的最大值。 +> +> - \\( n, m \leq 10^5 \\) + +剛接觸這個問題時,這個例題可能難度較高,所以我們先忽略第一種操作。 + +考慮使用傳統的懶標記來解決,首先如果只是詢問區間最大值,只需要使用區間加減這一個懶標記(用 \\( Add \\) 表示)就能解決。 + +現在考慮詢問區間歷史最大值的最大值。我們定義一種新的懶標記:歷史最大的加減標記(用 \\( Pre \\) 表示)。這個標記的定義是,從上一次把這個節點的標記下傳的時刻到當前時刻這一個時段中,這個節點中的 \\( Add \\) 標記值到達過的最大值。 + +當第 \\( i \\) 個節點的標記下傳到他的子節點 \\( l \\),不難發現標記是可以合併的:\\( Pre_l = max(Pre_l, Add_l + Pre_i), Add_l = Add_l + Add_i \\)。至於區間歷史最大值資訊的更新也與標記的合併類似,只需要將當前的區間最大值加上 \\( Pre_i \\) 然後與原來的歷史最大值進行比較即可。 + +現在回到原題,我們觀察在修改操作過程中,被影響到的節點的變化:如果一個節點沒有發生標記下傳,那麼最開始它一直被區間加減操作所影響,這時我們可以用上面描述的 \\( Pre \\) 標記來記錄,直到某一時刻,這個節點被區間覆蓋標記影響了,瞭那麼這時這個節點中的所有數都變得完全相同,之後的所有區間加減修改,對這個節點而言,與區間覆蓋操作並沒有不同。 + +因此每一個節點受到的標記可以分成兩個部分:第一個部分昰區間加減,第二個部分是區間覆蓋。因此我們可以用 \\( (x, y) \\) 來表示歷史最值標記,它的定義是當前區間在第一階段時最大的加減標記是 \\( x \\),在第二階段時最大的覆蓋標記是 \\( y \\)。顯然這個標記昰可以進行合併與更新的。到此我們就使用最傳統的懶標記方法解決了這個問題,時間複雜度是 \\( O(mlogn) \\)。 + +
Solution Code + +```cpp +#include +using namespace std; +typedef long long ll; + +char nc() { + static char buf[1000000], *p = buf, *q = buf; + return p == q && (q = (p = buf) + fread(buf, 1, 1000000, stdin), p == q) + ? EOF + : *p++; +} + +ll rd() { // LLONG_MIN LMAX=9,223,372,036,854,775,807 + ll s = 0, w = 1; + char ch = nc(); + while (ch < '0' || ch > '9') { + if (ch == '-') w = -1; + ch = nc(); + } + while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = nc(); + return s * w; +} + +const int N = 1e5 + 7; + +struct Tree { + int mx, _mx; // 區間最大值 區間歷史最大值 + int ad, _ad; // 區間加標記 區間階段歷史最大加標記 + int st, _st; // 區間修改值 區間階段歷史最大修改標記 +} g[N * 4]; + +int a[N]; +int n, m; +#define ls u * 2 +#define rs u * 2 + 1 +#define mid (l + r) / 2 + +void pushup(int u) { + g[u].mx = max(g[ls].mx, g[rs].mx); + g[u]._mx = max(g[ls]._mx, g[rs]._mx); +} + +void pushadd(int u, int v, int _v) { + g[u]._mx = max(g[u]._mx, g[u].mx + _v), g[u].mx += v; + if (g[u].st == INT_MIN) + g[u]._ad = max(g[u]._ad, g[u].ad + _v), g[u].ad += v; + else + g[u]._st = max(g[u]._st, g[u].st + _v), g[u].st += v; +} + +void pushset(int u, int v, int _v) { + g[u]._mx = max(g[u]._mx, _v), g[u].mx = v; + g[u]._st = max(g[u]._st, _v), g[u].st = v; +} + +void pushdown(int u, int l, int r) { + if (g[u].ad || g[u]._ad) + pushadd(ls, g[u].ad, g[u]._ad), pushadd(rs, g[u].ad, g[u]._ad), + g[u].ad = g[u]._ad = 0; + if (g[u].st != INT_MIN || g[u]._st != INT_MIN) + pushset(ls, g[u].st, g[u]._st), pushset(rs, g[u].st, g[u]._st), + g[u].st = g[u]._st = INT_MIN; +} + +void build(int u = 1, int l = 1, int r = n) { + g[u]._st = g[u].st = INT_MIN; + if (l == r) { + g[u].mx = a[l]; + g[u]._mx = a[l]; + return; + } + build(ls, l, mid), build(rs, mid + 1, r); + pushup(u); +} + +int L, R; + +void add(int v, int u = 1, int l = 1, int r = n) { + if (R < l || r < L) return; + if (L <= l && r <= R) return pushadd(u, v, max(v, 0)); + pushdown(u, l, r); + add(v, ls, l, mid), add(v, rs, mid + 1, r); + pushup(u); +} + +void tset(int v, int u = 1, int l = 1, int r = n) { + if (R < l || r < L) return; + if (L <= l && r <= R) return pushset(u, v, v); + pushdown(u, l, r); + tset(v, ls, l, mid), tset(v, rs, mid + 1, r); + pushup(u); +} + +int qmax(int u = 1, int l = 1, int r = n) { + if (R < l || r < L) return INT_MIN; + if (L <= l && r <= R) return g[u].mx; + pushdown(u, l, r); + return max(qmax(ls, l, mid), qmax(rs, mid + 1, r)); +} + +int qmaxh(int u = 1, int l = 1, int r = n) { + if (R < l || r < L) return INT_MIN; + if (L <= l && r <= R) return g[u]._mx; + pushdown(u, l, r); + return max(qmaxh(ls, l, mid), qmaxh(rs, mid + 1, r)); +} + +int main() { + n = rd(); + for (int i = 1; i <= n; ++i) a[i] = rd(); + build(); + int m = rd(), z; + for (int i = 1; i <= m; ++i) { + char op = nc(); + while (op == ' ' || op == '\r' || op == '\n') op = nc(); + L = rd(), R = rd(); + if (op == 'Q') + printf("%d\n", qmax()); + else if (op == 'A') + printf("%d\n", qmaxh()); + else if (op == 'P') + add(rd()); + else + tset(rd()); + } + return 0; +} +``` + +
+ +> 例題 5. [UOJ -【清华集训 2015】V](http://uoj.ac/problem/164) +> +> 給一個長度為 \\( n \\) 的序列 \\( A \\),同時定義一個輔助數組 \\( B \\),\\( B \\)開始與 \\( A \\) 完全相同。接下來對其進行 \\( m \\) 筆操作,操作有五種: +> +> 1. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 修改成 \\( max(A_i - x, 0) \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 加上 \\( x \\)。 +> 3. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 修改成 \\( x \\)。 +> 4. 給定 \\( i \\),輸出 \\( A_i \\) 的值。 +> 5. 給定 \\( i \\),輸出 \\( B_i \\) 的值。 +> +> 每一次操作後,對所有 \\( i \\),將 \\( B_i \\) 修改成 \\( max(B_i, A_i) \\)。 +> +> - \\( n, m \leq 5 \times 10^5 \\) + +首先我們定義一種標記 \\( (a, b) \\),表示給這個區間中的所有數先加上 \\( a \\),然後再對 \\( b \\) 取 \\( max \\)。不難發現題目中涉及的三種操作都可以用這個標記來表示,分別為 \\( (-x, 0) \\)、\\( (x, -inf) \\)、\\( (-inf, x) \\),\\( inf \\)是一個事先假設足夠大的數。 + +考慮合併兩個標記 \\( (a, b) \\) 與 \\( (c, d) \\),那麼顯然得到的就是 \\( (a + c, max(b+c, d)) \\)。因此對於詢問 \\( 4 \\),我們只需要把詢問的葉節點到根路徑上的所有標記都下傳到葉節點,就能直接得到答案了。 + +現在考慮歷史最大標記。我們可以把標記給看成一個函數,每一個數字對應的函數值表示這個數在作用了這個標記後的答案,在這個問題中,標記 \\( (a, b) \\) 相當於是一個分段函數,第一段是一條與 \\( x \\) 軸平行的直線,第二段是一條斜率為 \\( 1 \\) 的直線。 + +在更新歷史最大標記時,我們相當於把兩個標記的圖像同時放到一個坐標系中,然後取出上方的那一段。下圖展示的是標記合併時可能出現的一種情況,藍色的部分是原來的兩個標記,紅色部分是更新後得到的標記。 + + + +因為在更新標記之後形式和原來相同,所以這個歷史最值標示是可以維護的。對於詢問 \\( 4 \\),我們只需要把所有相關的標記給下傳下去,就能得到答案了。時間複雜度是 \\( O(mlogn) \\)。 + +
Solution Code + +```cpp +#include +#include +#include +#include +#include +#define fo(i,a,b) for(i=a;i<=b;i++) +using namespace std; +typedef long long ll; +const ll maxn=5e5+7,inf=999999999999999; +ll i,j,k,l,n,m,o,r,x,y; +ll a[maxn]; +struct node{ + ll a,b,da,db; + void operator +=(node &x){ + da=max(da,a+x.da);db=max(db,max(b+x.da,x.db)); + a=max(a+x.a,-inf);b=max(b+x.a,x.b); + } +}t[maxn*4],now; +void build(ll x,ll l,ll r){ + t[x]=(node){0,-inf,0,-inf}; + if(l==r){ + t[x].a=a[l]; + return; + } + ll mid=(l+r)/2; + build(x*2,l,mid);build(x*2+1,mid+1,r); +} +void down(ll x){ + t[x*2]+=t[x];t[x*2+1]+=t[x]; + t[x]=(node){0,-inf,0,-inf}; +} +void change(ll x,ll l,ll r,ll y,ll z){ + if(l==y&&r==z){t[x]+=now;return;} + ll mid=(l+r)/2; + down(x); + if(z<=mid)change(x*2,l,mid,y,z); + else if(y>mid)change(x*2+1,mid+1,r,y,z); + else change(x*2,l,mid,y,mid),change(x*2+1,mid+1,r,mid+1,z); +} +void find(ll x,ll l,ll r,ll y){ + if(l==r){now=t[x];return;} + down(x);ll mid=(l+r)/2; + if(y<=mid)find(x*2,l,mid,y);else find(x*2+1,mid+1,r,y); +} +int main(){ + scanf("%lld%lld",&n,&m); + fo(i,1,n)scanf("%lld",&a[i]); + build(1,1,n); + while(m--){ + scanf("%lld",&o); + if(o<=3){ + scanf("%lld%lld%lld",&l,&r,&x); + if(o==1)now=(node){x,-inf,x,-inf}; + else if(o==3)now=(node){-inf,x,-inf,x}; + else now=(node){-x,0,-x,0}; + change(1,1,n,l,r); + } + else{ + scanf("%lld",&x); + find(1,1,n,x); + if(o==4)printf("%lld\n",max(now.a,now.b)); + else printf("%lld\n",max(now.da,now.db)); + } + } +} +``` + +
+ +### 無法用懶標記處理的單點問題 + +這裡的單點問題除了詢問單點的歷史最值之外,也包含區間詢問歷史最小值的最小值與區間詢問歷史最大值的最大值。因為這兩個區間詢問的處理方法與單點完全相同,所以把它們歸入單點問題之中。 + +> 例題 6. [UOJ - 元旦老人与数列](http://uoj.ac/problem/169) +> +> 給一個長度為 \\( n \\) 的序列 \\( A \\),同時定義一個輔助數組 \\( B \\),\\( B \\)開始與 \\( A \\) 完全相同。接下來對其進行 \\( m \\) 筆操作,操作有四種: +> +> 1. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 修改成 \\( max(A_i, x) \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 加上 \\( x \\)。 +> 3. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),輸出 \\( A_i \\) 的最小值。 +> 4. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),輸出 \\( B_i \\) 的最小值。 +> +> 每一次操作後,對所有 \\( i \\),將 \\( B_i \\) 修改成 \\( min(B_i, A_i) \\)。 +> +> - \\( n, m \leq 3 \times 10^5 \\) + +這題涉及到區間最值操作,我們已經對區間最值操作進行了深入的研究。 + +因為在這個問題中,區間最值操作的方向與歷史最值詢問的方向是相反的(一個是取 \\( max \\),一個是歷史最小值),所以標記無法合併。如下圖所示,兩個紅色標記合併出來的部分是下方的藍色曲線,它的段數會隨著更新次數線性增長,這是不能被接受的,因此我們無法沿用例題 \\( 5 \\) 的懶標記做法。 + + + +我們可以沿用把先前把區間最值操作轉換為區間加減操作的方法。將線段樹中每一個節點所控制的位置分成最小值與非最小值兩部分,這樣要處理的就只有區間加減操作了:這時的歷史最值標記是可以輕鬆維護的。具體來說,維護下面幾個標記: + +1. 最小值加減標記 +2. 最小值歷史最小的加減標記 +3. 非最小值加減標記 +4. 非最小值歷史最小的加減標記 + +前兩個標記是指修改最小值的,所以下傳時要判斷當前節點是否包含區間最小值。到此我們就解決了這個問題,時間複雜度是 \\( O(mlog^2n) \\)。 + +
Solution Code + +```cpp +#include +#include +#include +#include +#define inf 2147483647 +using namespace std; +const int Mx=1000010; +int n,m,root,a[Mx],l[Mx],r[Mx]; +int tot,lson[Mx],rson[Mx],val[Mx],lazy[Mx],sum[Mx],Mnhis[Mx]; +int Val[Mx],Lazy[Mx],Sum[Mx]; //次小值 + +inline int read() { + int x=0,f=1;char ch=getchar(); + while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } + while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } + return x*f; +} + +void pushup(int x) { + int L=lson[x],R=rson[x]; + Mnhis[x]=min(Mnhis[L],Mnhis[R]); + val[x]=min(val[L],val[R]); + if(val[L]!=val[R]) + Val[x]=min(max(val[L],val[R]),min(Val[L],Val[R])); + else + Val[x]=min(Val[L],Val[R]); +} + +void build(int &x,int L,int R) { + x=++tot,l[x]=L,r[x]=R; + if(L==R) + val[x]=a[L],Val[x]=inf,Mnhis[x]=val[x]; + else { + int mid=(L+R)/2; + build(lson[x],L,mid); + build(rson[x],mid+1,R); + pushup(x); + } +} + +void Push(int x,int i,bool flag) { + int la=lazy[i],La=Lazy[i],su=sum[i],Su=Sum[i]; + if(!flag) la=La,su=Su; + Mnhis[x]=min(Mnhis[x],val[x]+su); + val[x]+=la; if(Val[x]!=inf) Val[x]+=La; + sum[x]=min(sum[x],lazy[x]+su),Sum[x]=min(Sum[x],Lazy[x]+Su); + lazy[x]+=la,Lazy[x]+=La; +} + +void pushdown(int x) { + if(!lazy[x]&&!Lazy[x]&&sum[x]>=0&&Sum[x]>=0) return ; + int L=lson[x],R=rson[x]; + if(val[L]==val[R]) Push(L,x,1),Push(R,x,1); + if(val[L]val[R]) Push(L,x,0),Push(R,x,1); + lazy[x]=Lazy[x]=sum[x]=Sum[x]=0; +} + +void Add(int x,int ll,int rr,int c) { + int L=l[x],R=r[x]; + if(L>rr||R=R) { + val[x]+=c; if(Val[x]!=inf) Val[x]+=c; + lazy[x]+=c,Lazy[x]+=c; + sum[x]=min(sum[x],lazy[x]),Sum[x]=min(Sum[x],Lazy[x]); + Mnhis[x]=min(Mnhis[x],val[x]); + } + else { + pushdown(x); + Add(lson[x],ll,rr,c); + Add(rson[x],ll,rr,c); + pushup(x); + } +} + +void Max(int x,int ll,int rr,int c) { + int L=l[x],R=r[x]; + if(L>rr||R=R&&Val[x]>c) { + if(val[x]rr||R=R) { + if(flag) return Mnhis[x]; + else return val[x]; + } + else { + pushdown(x); + int ans=min(Query(lson[x],ll,rr,flag),Query(rson[x],ll,rr,flag)); + pushup(x); + return ans; + } +} + +int main() { + scanf("%d%d",&n,&m); + for(int i=1;i<=n;i++) a[i]=read();; + build(root,1,n); + for(int i=1,num,x,y,z;i<=m;i++) { + scanf("%d%d%d",&num,&x,&y); + if(num==1) z=read(),Add(root,x,y,z); + if(num==2) z=read(),Max(root,x,y,z); + if(num==3) printf("%d\n",Query(root,x,y,0)); + if(num==4) printf("%d\n",Query(root,x,y,1)); + } + return 0; +} +``` + +
+ +### 無區間最值操作的區間問題 + +這裡所指的問題主要是以下三個:區間加減,詢問區間歷史最小值的和;區間加減,詢問區間歷史最大值的和;區間加減,詢問區間歷史版本和的和。 + +這三個問題都不能使用懶標記來進行維護,而且也不像區間最值操作一樣被我們所熟知。接下來將分別對這三個問題介紹轉換方法。 + +#### 歷史最大值 + +設 \\( A_i \\)為當前數組,\\( B_i \\) 為歷史最大值。定義一個輔助數組 \\( C_i \\),每一個時刻都讓 \\( C_i = A_i - B_i \\)。我們對 \\( A_i \\) 加上數 \\( x \\) 時,如果 \\( B_i \\) 沒有發生變化,相當於給 \\( C_i \\) 加上了 \\( x \\)。具體來說,區間加減操作相當於將 \\( C_i \\) 變成了\\( max(C_i + x, 0) \\),這是一個我們熟悉的操作。 + +考慮區間和這個詢問,只要能夠求出 \\( A_i \\) 和 \\( C_i \\) 的區間和,直接相減便能得到答案。前者是基礎的線段樹問題,後者我們已經在先前研究過了。到此我們得到一種 \\( O(mlog^2n) \\) 的算法。 + +#### 歷史最小值 + +處理方法與歷史最大值類似。設 \\( A_i \\)為當前數組,\\( B_i \\) 為歷史最小值。同樣定義一個輔助數組 \\( C_i \\),每一個時刻都讓 \\( C_i = A_i - B_i \\)。這時區間加減操作相當於將 \\( C_i \\) 變成\\( min(C_i + x, 0) \\),直接求和即可。 + +時間複雜度 \\( O(mlog^2n) \\)。 + +#### 歷史版本和 + +設 \\( A_i \\)為當前數組,\\( B_i \\) 為歷史版本和,同時我們讓 \\( t \\) 為當前結束的操作數(不包括當次操作)。定義一個輔助數組 \\( C_i \\),每一個時刻都讓 \\( C_i = B_i - t \cdot A_i \\)。 + +可以發現對於區間加減沒有影響到的位置,\\( B_i \\) 都不會發生變化。當我們給 \\( A_i \\) 加上 \\( x \\) 時,相當於給 \\( C_i \\) 減去了 \\( x \cdot t \\)。於是我們就把歷史版本和轉換成簡單的區間加減詢問區間和的問題,直接用懶標記即可。 + +時間複雜度 \\( O(mlogn) \\)。 + +### 有區間最值操作的區間問題 + +經過上面的討論後,這最後一類算法已經有了雛型:只需要先把區間最值操作轉換成區間加減操作,再使用上一小節中的方法來進行求解就能得到答案了。 + +> 例題 7. 賽格蒙特彼茨 +> +> 給一個長度為 \\( n \\) 的序列 \\( A \\),同時定義一個輔助數組 \\( B \\),\\( B \\)開始與 \\( A \\) 完全相同。接下來對其進行 \\( m \\) 筆操作,操作有三種: +> +> 1. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 修改成 \\( max(A_i, x) \\)。 +> 2. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),將 \\( A_i \\) 加上 \\( x \\)。 +> 3. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),輸出 \\( B_i \\) 的和。 +> +> 每一次操作後,對所有 \\( i \\),將 \\( B_i \\) 修改成 \\( min(B_i, A_i) \\)。 +> +> - \\( n, m \leq 10^5 \\) + +首先,我們使用上一小節中的方法,把詢問轉化成維護數組 \\( A \\) 和數組 \\( C \\) 的區間和。接著我們對數組 \\( A \\) 維護區間最小值和次小值,從而把區間取 \\( max \\) 操作轉換成對區間最小值的加減操作,這樣就能維護數組 \\( A \\) 的區間和了。 + +然後,我們來考慮怎麼對 \\( C \\) 維護區間和,影響到 \\( C \\) 的操作有 + ## Exercises > [Codeforces 438D The Child and Sequence](https://codeforces.com/contest/438/problem/D) From c993f9cf6b0a5b503e70ec3d0b665980d13ae49f Mon Sep 17 00:00:00 2001 From: 110034024 Date: Thu, 15 Jun 2023 16:38:14 +0800 Subject: [PATCH 5/7] add conclusion --- .../image/segment_tree_beats/c_tag.png | Bin 0 -> 184060 bytes src/data_structure/segment_tree_beats.md | 43 ++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 src/data_structure/image/segment_tree_beats/c_tag.png diff --git a/src/data_structure/image/segment_tree_beats/c_tag.png b/src/data_structure/image/segment_tree_beats/c_tag.png new file mode 100644 index 0000000000000000000000000000000000000000..d57c1894f9a3855e0bb1b32c4ddace5dd956c1f5 GIT binary patch literal 184060 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

ZOBbtR*7!Enp=Hjh9N_x- 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�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%0A>TPF_A21e~_Psqx? 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

{DIzRuuf*$1XpJe(Rj$F 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 M1VFq()G*+G0e}aL{{R30 literal 0 HcmV?d00001 diff --git a/src/data_structure/segment_tree_beats.md b/src/data_structure/segment_tree_beats.md index fa65d993..78185dba 100644 --- a/src/data_structure/segment_tree_beats.md +++ b/src/data_structure/segment_tree_beats.md @@ -30,7 +30,7 @@ Segment Tree Beats(簡稱 STB)是北京大學的吉如一提出的概念, 2. 當 \\( mx2 < x < mx1 \\) 時,顯然這一次修改只會影響到所有最大值,所以我們把 \\( num \\) 加上 \\( t \cdot (x - mx) \\),將 \\( mx \\) 更新為 \\( x \\),接著打上標記然後退出。 3. 當 \\( mx2 \geq x \\) 時,我們無法直接更新這一個節點的資訊,所以在此時,我們對當前節點的左子節點與右子節點進行遞迴搜尋。 -如下圖所示,左圖是一顆建立在 \\( [1, 4] \\) 上的線段樹,每一個節點紀錄的資訊的左側是區間最大值,右側是嚴格次大值。現在我們要讓區間 \\( [1, 4] \\) 對 \\( 2 \\) 取 \\( min \\)。那麼左圖中紅色邊表示搜尋時經過的邊,紅色字體的節點表示搜索終止的節點,右圖為更新後的線段樹。 +如下圖所示,左圖是一棵建立在 \\( [1, 4] \\) 上的線段樹,每一個節點紀錄的資訊的左側是區間最大值,右側是嚴格次大值。現在我們要讓區間 \\( [1, 4] \\) 對 \\( 2 \\) 取 \\( min \\)。那麼左圖中紅色邊表示搜尋時經過的邊,紅色字體的節點表示搜索終止的節點,右圖為更新後的線段樹。 @@ -214,9 +214,9 @@ signed main() { 考慮 DFS 的過程,我們先透過線段樹定位數個節點,然後從這些節點開始 DFS。我們對每一個開始節點考慮每一類會被回收的標記:如果這一類標記只有一部分在這個子樹中,那麼我們每經過一個節點都會讓這個標記的權值減一;而如果這一類標記全部都在子樹中,回收的過程相當於先花一些代價定位這一類標記的 LCA,然後再在標記的虛數上進行回收。 -所以我們可以將複雜度分成兩部分,第一部分昰減少輔助函數時花費的時間複雜度,這是 \\( O(mlogn) \\) 的;第二部分的複雜度是定位某一類標記的 LCA 時產生的複雜度,每一類標記都有可能對這一部分的複雜度產生 \\( O(mlogn) \\) 的貢獻,因為標記的總數只有 \\( O(mlogn) \\),所以標記的類數也是 \\( O(mlogn) \\)的,因此這一部分的複雜度的一個上界是 \\( O(mlogn) \\)。 +所以我們可以將複雜度分成兩部分,第一部分昰減少輔助函數時花費的時間複雜度,這是 \\( O(mlogn) \\) 的;第二部分的複雜度是定位某一類標記的 LCA 時產生的複雜度,每一類標記都有可能對這一部分的複雜度產生 \\( O(mlogn) \\) 的貢獻,因為標記的總數只有 \\( O(mlogn) \\),所以標記的類數也是 \\( O(mlogn) \\)的,因此這一部分的複雜度的一個上界是 \\( O(mlog^2n) \\)。 -至此,我們證明了這一個算法的複雜度的上界是 \\( O(mlogn) \\)。實際上這個上界是比較鬆的,吉如一老師猜想標記的總類數是線性的,即這一個算法的時間複雜度是 \\( O(mlogn) \\) 的,然而到目前為止還沒有好的方法可以證明。 +至此,我們證明了這一個算法的複雜度的上界是 \\( O(mlog^2n) \\)。實際上這個上界是比較鬆的,吉如一老師猜想標記的總類數是線性的,即這一個算法的時間複雜度是 \\( O(mlogn) \\) 的,然而到目前為止還沒有好的方法可以證明。 觀察例題 \\( 2 \\) 的時間複雜度證明,我們發現在證明時並沒有使用到區間加減操作的具體性質,所以將區間加減操作替換成其他的修改操作,上述的證明仍然成立。 @@ -983,15 +983,15 @@ int main() { 這三個問題都不能使用懶標記來進行維護,而且也不像區間最值操作一樣被我們所熟知。接下來將分別對這三個問題介紹轉換方法。 -#### 歷史最大值 +#### 歷史最小值 -設 \\( A_i \\)為當前數組,\\( B_i \\) 為歷史最大值。定義一個輔助數組 \\( C_i \\),每一個時刻都讓 \\( C_i = A_i - B_i \\)。我們對 \\( A_i \\) 加上數 \\( x \\) 時,如果 \\( B_i \\) 沒有發生變化,相當於給 \\( C_i \\) 加上了 \\( x \\)。具體來說,區間加減操作相當於將 \\( C_i \\) 變成了\\( max(C_i + x, 0) \\),這是一個我們熟悉的操作。 +設 \\( A_i \\)為當前數組,\\( B_i \\) 為歷史最小值。定義一個輔助數組 \\( C_i \\),每一個時刻都讓 \\( C_i = A_i - B_i \\)。我們對 \\( A_i \\) 加上數 \\( x \\) 時,如果 \\( B_i \\) 沒有發生變化,相當於給 \\( C_i \\) 加上了 \\( x \\)。具體來說,區間加減操作相當於將 \\( C_i \\) 變成了\\( max(C_i + x, 0) \\),這是一個我們熟悉的操作。 考慮區間和這個詢問,只要能夠求出 \\( A_i \\) 和 \\( C_i \\) 的區間和,直接相減便能得到答案。前者是基礎的線段樹問題,後者我們已經在先前研究過了。到此我們得到一種 \\( O(mlog^2n) \\) 的算法。 -#### 歷史最小值 +#### 歷史最大值 -處理方法與歷史最大值類似。設 \\( A_i \\)為當前數組,\\( B_i \\) 為歷史最小值。同樣定義一個輔助數組 \\( C_i \\),每一個時刻都讓 \\( C_i = A_i - B_i \\)。這時區間加減操作相當於將 \\( C_i \\) 變成\\( min(C_i + x, 0) \\),直接求和即可。 +處理方法與歷史最小值類似。設 \\( A_i \\)為當前數組,\\( B_i \\) 為歷史最大值。同樣定義一個輔助數組 \\( C_i \\),每一個時刻都讓 \\( C_i = A_i - B_i \\)。這時區間加減操作相當於將 \\( C_i \\) 變成\\( min(C_i + x, 0) \\),直接求和即可。 時間複雜度 \\( O(mlog^2n) \\)。 @@ -1021,7 +1021,34 @@ int main() { 首先,我們使用上一小節中的方法,把詢問轉化成維護數組 \\( A \\) 和數組 \\( C \\) 的區間和。接著我們對數組 \\( A \\) 維護區間最小值和次小值,從而把區間取 \\( max \\) 操作轉換成對區間最小值的加減操作,這樣就能維護數組 \\( A \\) 的區間和了。 -然後,我們來考慮怎麼對 \\( C \\) 維護區間和,影響到 \\( C \\) 的操作有 +然後,我們來考慮怎麼對 \\( C \\) 維護區間和,影響到 \\( C \\) 的操作有:對所有 \\( i \in [l, r] \\),將 \\( C_i \\) 修改成 \\( max(C_i, x) \\)(接下來稱為第一類操作);對所有 \\( i \in [l, r] \\),如果 \\( A_i \\) 是這個區間中 \\( A \\) 的最小值,那麼將 \\( C_i \\) 修改成 \\( max(C_i, x) \\)(接下來稱為第二類操作)。 + +我們對線段樹每一個節點維護所有 \\( A \\) 的值是最小值的位置中,\\( C_i \\) 的最小值、次小值、最小值個數,以及所有 \\( A \\) 的值不是最小值的位置中,\\( C_i \\) 的最小值、次小值、最小值個數,然後對 \\( C \\) 進行修改時,分別進行暴力 DFS 即可。 + +最後我們來證明這個算法的時間複雜度。我們把數組 \\( A \\) 的部分稱為第一層,數組 \\( C \\) 的部分稱為第二層。首先第一層的複雜度之前已經證明是 \\( O(mlog^2n) \\) 的,所以我們接下來只考慮第二層的複雜度。 + +仿照先前的方法,首先我們先把第二層的最小值轉換成標記。可以對 \\( A \\) 的值等於最小值的所有位置,以及 \\( A \\) 的值不等於最小值的所有位置分別轉換成標記(接下來我們把這兩個分別稱為第一棵樹和第二棵樹)。如下圖所示,上方是原樹,兩側分別為 \\( A \\) 和 \\( C \\) 的最小值,下方左圖是第一棵樹,右圖是第二棵樹: + + + +可以發現任何時刻,任何一個出現在第二棵樹的標記一定在第一棵樹中出現過,所以兩棵樹上出現過的標記總數的數量級和第一棵樹是相同的,所以我們只需要對第一棵樹進行分析就行了。 + +因為第一棵樹的定義是依賴數組 \\( A \\) 的,所以如果在原樹中某一節點的最小值和其父節點不同,那麼在第一棵樹中這個位置到它父親的轉移是不存在的,我們需要刪掉這條邊(在圖中用虛線表示)。因此在轉換後第一棵樹被剖成了數個連通塊,每一個連通塊都至少存在一個葉節點且滿足標記值隨著深度的增加而遞增的性質。 + +因為直接對第一棵樹進行標記回收及區間加減時和數組 \\( A \\) 並沒有什麼區別,所以我們只考慮數組 \\( A \\) 中進行暴力 DFS 時產生的影響。在暴力 DFS 時,我們不僅對第一棵樹進行了數次子樹加減操作,還合併了數個連通塊。不過如果我們在 DFS 的同時對標記進行下傳,那麼在合併兩個連通塊時,處在下方的連通塊的根結點和上方連通塊的根結點之間的路徑上應該沒有任何標記,所以這時直接把兩個連通塊合併起來,是不影響標記隨著深度遞增的限制的。 + +先前我們證明了暴力 DFS 時經過的節點數的一個上界是 \\( O(mlog^2n) \\),因此在第一棵樹中標記下傳的次數的上界是 \\( O(mlog^2n) \\),標記總數是 \\( O(mlog^2n)的 \\)。沿用之前的證明,我們可以得到這個算法的一個複雜度上界是 \\( O(mlog^3n) \\)。 + +不難發現這個上界是非常鬆的,實際上在目前的數據中,暴力 DFS 的次數都遠遠沒有達到 \\( O(mlog^3n) \\) 的級別,所以吉如一老師猜想應該存在更低的上界的證明,但是目前還沒有得到更好的證明方法,所以目前用 \\( O(mlog^3n) \\)作為上界來衡量這個算法的運行效率。 + +至此,我們得到一個 \\( O(mlog^3n) \\) 的算法來解決這題。不難發現上述的證明對更多層的嵌套依然有效,假如我們有 \\( K \\) 個數組進行嵌套,那麼沿用上述算法可以得到一個 \\( O(2^k \cdot mlog_{K+1}n) \\) 複雜度的算法。 + +### 總結 + +STB 可以達到下列兩個目標: + +1. 將區間最值操作轉換成區間加減操作,在 \\( O(logn) \\) 的時間複雜度內完成 +2. 將歷史最值問題轉換成區間最值操作,在 \\( O(1) \\) 的時間複雜度內完成 ## Exercises From 446194af9d11f85ac0e021acc990803c46eda75d Mon Sep 17 00:00:00 2001 From: 110034024 Date: Thu, 15 Jun 2023 17:41:46 +0800 Subject: [PATCH 6/7] add tag function --- src/data_structure/segment_tree_beats.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/data_structure/segment_tree_beats.md b/src/data_structure/segment_tree_beats.md index 78185dba..a7969617 100644 --- a/src/data_structure/segment_tree_beats.md +++ b/src/data_structure/segment_tree_beats.md @@ -734,17 +734,17 @@ int main() { > > - \\( n, m \leq 5 \times 10^5 \\) -首先我們定義一種標記 \\( (a, b) \\),表示給這個區間中的所有數先加上 \\( a \\),然後再對 \\( b \\) 取 \\( max \\)。不難發現題目中涉及的三種操作都可以用這個標記來表示,分別為 \\( (-x, 0) \\)、\\( (x, -inf) \\)、\\( (-inf, x) \\),\\( inf \\)是一個事先假設足夠大的數。 +首先我們定義一種標記 \\( (a, b) \\),這種標記是函數 \\( f_{a, b}(x) = max(x + a, b) \\),表示給這個區間中的所有數先加上 \\( a \\),然後再對 \\( b \\) 取 \\( max \\)。不難發現題目中涉及的三種操作都可以用這個標記來表示,分別為 \\( (-x, 0) \\)、\\( (x, -inf) \\)、\\( (-inf, x) \\),\\( inf \\)是一個事先假設足夠大的數。 -考慮合併兩個標記 \\( (a, b) \\) 與 \\( (c, d) \\),那麼顯然得到的就是 \\( (a + c, max(b+c, d)) \\)。因此對於詢問 \\( 4 \\),我們只需要把詢問的葉節點到根路徑上的所有標記都下傳到葉節點,就能直接得到答案了。 +考慮合併兩個標記 \\( (a, b) \\) 與 \\( (c, d) \\),\\( f_{c, d}(f_{a, b}(x)) = max(max(x + a, b) + c, d) = max(x + a + c, max(b + c, d)) = f_{a + c, max(b + c, d)} \\),那麼顯然得到的就是 \\( (a + c, max(b + c, d)) \\)。因此對於詢問 \\( 4 \\),我們只需要把詢問的葉節點到根路徑上的所有標記都下傳到葉節點,就能直接得到答案了。 -現在考慮歷史最大標記。我們可以把標記給看成一個函數,每一個數字對應的函數值表示這個數在作用了這個標記後的答案,在這個問題中,標記 \\( (a, b) \\) 相當於是一個分段函數,第一段是一條與 \\( x \\) 軸平行的直線,第二段是一條斜率為 \\( 1 \\) 的直線。 +現在考慮歷史最大標記。我們可以把標記給看成一個函數 \\( h(x) \\),每一個數字對應的函數值表示這個數在作用了這個標記後的答案,在這個問題中,標記 \\( (a, b) \\) 相當於是一個分段函數,第一段是一條與 \\( x \\) 軸平行的直線,第二段是一條斜率為 \\( 1 \\) 的直線。 在更新歷史最大標記時,我們相當於把兩個標記的圖像同時放到一個坐標系中,然後取出上方的那一段。下圖展示的是標記合併時可能出現的一種情況,藍色的部分是原來的兩個標記,紅色部分是更新後得到的標記。 -因為在更新標記之後形式和原來相同,所以這個歷史最值標示是可以維護的。對於詢問 \\( 4 \\),我們只需要把所有相關的標記給下傳下去,就能得到答案了。時間複雜度是 \\( O(mlogn) \\)。 +因為在更新標記之後形式和原來的形式 \\( f_{a, b}(x) \\) 相同,所以這個歷史最值標示是可以維護的。對於詢問 \\( 4 \\),我們只需要把所有相關的標記給下傳下去,就能得到答案了。時間複雜度是 \\( O(mlogn) \\)。

Solution Code @@ -1048,11 +1048,12 @@ int main() { STB 可以達到下列兩個目標: 1. 將區間最值操作轉換成區間加減操作,在 \\( O(logn) \\) 的時間複雜度內完成 -2. 將歷史最值問題轉換成區間最值操作,在 \\( O(1) \\) 的時間複雜度內完成 +2. 將無區間最值操作的歷史最值的區間問題轉換成區間最值操作,在 \\( O(1) \\) 的時間複雜度內完成(區間加減,詢問區間歷史最小值的和;區間加減,詢問區間歷史最大值的和;區間加減,詢問區間歷史版本和的和) ## Exercises > [Codeforces 438D The Child and Sequence](https://codeforces.com/contest/438/problem/D) +> > 給定一個序列 \\( a_i \\),並對其進行 \\( m \\) 筆操作。操作有三種: > > 1. 給定 \\( l, r \\),請輸出區間總和 \\( a[l]+...+a[r] \\) From 46683f1514ad43cd818e51be576b11b7985f9743 Mon Sep 17 00:00:00 2001 From: 110034024 Date: Thu, 15 Jun 2023 19:07:42 +0800 Subject: [PATCH 7/7] add reference --- src/data_structure/segment_tree_beats.md | 124 ++++++++++++++++++++--- 1 file changed, 111 insertions(+), 13 deletions(-) diff --git a/src/data_structure/segment_tree_beats.md b/src/data_structure/segment_tree_beats.md index a7969617..3b2e82d8 100644 --- a/src/data_structure/segment_tree_beats.md +++ b/src/data_structure/segment_tree_beats.md @@ -414,7 +414,7 @@ void pushup(int u) { } void push_add(int u, int l, int r, int v) { - // 更新加法標記的同时,更新 \\( min \\) 和 \\( max \\) 標記 + // 更新加法標記的同时,更新 min 和 max 標記 t[u].sum += (r - l + 1ll) * v; t[u].mx += v, t[u].mn += v; if (t[u].mx2 != -INF) t[u].mx2 += v; @@ -425,12 +425,12 @@ void push_add(int u, int l, int r, int v) { } void push_min(int u, int tg) { - // 注意比較 \\( max \\) 標記 + // 注意比較 max 標記 if (t[u].mx <= tg) return; t[u].sum += (tg * 1ll - t[u].mx) * t[u].cmx; if (t[u].mn2 == t[u].mx) t[u].mn2 = tg; if (t[u].mn == t[u].mx) t[u].mn = tg; - if (t[u].tmx > tg) t[u].tmx = tg; // 更新取 \\( max \\) 標記 + if (t[u].tmx > tg) t[u].tmx = tg; // 更新取 max 標記 t[u].mx = tg, t[u].tmn = tg; } @@ -1052,13 +1052,91 @@ STB 可以達到下列兩個目標: ## Exercises +以下我們來看一些題目。 + +> [UOJ 515【UR #19】前进四](https://uoj.ac/problem/515) +> +> 給定一個序列 \\( a_i \\),並對其進行 \\( m \\) 筆操作。操作有兩種: +> +> 1. 給定 \\( x, v \\),將 \\( A_x \\) 修改成 \\( v \\)。 +> 2. 給定 \\( x \\),輸出 \\( A_x, A_{x + 1},……, A_n \\) 的不同後綴最小值個數。 +> +> - \\( n, m \leq 10^6 \\) + +
Solution + +這題有一個 \\( O(mlog^2n) \\) 的在線做法,但由於這題數據範圍很大,且時限只有 \\( 1 \\) 秒,所以我們採用一個效率更高的離線做法。 + +觀察到本題詢問的不是區間而是一個後綴,可以考慮從後往前掃描線,使用線段樹維護以時間為下標的後綴最小值。假設現在掃描到了位置 \\( i \\),考慮這個位置的某個修改操作,它會影響到從該修改的時刻開始,到位置 \\( i \\) 的下一次修改的時刻為止的一個時間段,具體來說,是將這個時間段的後綴 \\( min \\) 都對 \\( v \\) 取最小值。而對於每筆詢問,則是求掃描到 \\( x \\) 時該詢問發生的時刻被取了多少次最小值。這個次數是可以在下傳標記的過程中順帶維護的。 + +對比這種做法和兩個 \\( log \\) 的經典做法,優勢是時間複雜度低;劣勢則是不能在線且不好處理區間詢問(套分治會多一個 \\( log \\))。這道題需要注意一下常數。 + +```cpp +#include +#define Cn const +#define CI Cn int& +#define N 1000000 +using namespace std; +namespace FastIO { + #define FS 100000 + #define Tp template + #define Ts template + #define tc() (FA==FB&&(FB=(FA=FI)+fread(FI,1,FS,stdin),FA==FB)?EOF:*FA++) + #define pc(c) (FC==FE&&(clear(),0),*FC++=c) + int OT;char oc,FI[FS],FO[FS],OS[FS],*FA=FI,*FB=FI,*FC=FO,*FE=FO+FS; + void clear() {fwrite(FO,1,FC-FO,stdout),FC=FO;}struct IO_Cl {~IO_Cl() {clear();}}CL; + Tp void read(Ty& x) {x=0;while(!isdigit(oc=tc()));while(x=(x<<3)+(x<<1)+(oc&15),isdigit(oc=tc()));} + Ts void read(Ty& x,Ar&... y) {read(x),read(y...);} + Tp void writeln(Ty x) {while(OS[++OT]=x%10+48,x/=10);while(OT) pc(OS[OT--]);pc('\n');} +} +using namespace FastIO; +int n,Qt,ct,a[N+5],ti[N+5],ans[N+5]; +struct Data {int x,v,l,r;bool operator < (Cn Data& o) Cn {return x>o.x;}}s[2*N+5]; +struct Qry {int p,x;bool operator < (Cn Qry& o) Cn {return x>o.x;}}q[N+5]; +class SegmentTree { // Segment Tree Beats + private: + #define PT int l=1,int r=n,int o=1 + #define LT l,u,o<<1 + #define RT u+1,r,o<<1|1 + #define PD(o) (F[o]!=1e9&&(T(o<<1,F[o],G[o]),T(o<<1|1,F[o],G[o]),F[o]=1e9,G[o]=0)) + #define T(o,v,u) (Mx[o]>v&&(Mx[o]=v,F[o]=min(F[o],v),G[o]+=u)) + int Mx[N<<2],Sx[N<<2],F[N<<2],G[N<<2]; + void PU(int o) { + if(Mx[o<<1]==Mx[o<<1|1]) Mx[o]=Mx[o<<1],Sx[o]=max(Sx[o<<1],Sx[o<<1|1]); + else Mx[o<<1]>Mx[o<<1|1]?(Mx[o]=Mx[o<<1],Sx[o]=max(Sx[o<<1],Mx[o<<1|1])):(Mx[o]=Mx[o<<1|1],Sx[o]=max(Sx[o<<1|1],Mx[o<<1])); + } + public: + void Bd(PT) {if(Mx[o]=F[o]=1e9,l==r) return;int u=l+r>>1;Bd(LT),Bd(RT);} + void U(int L,int R,int v,PT) { // 區間向 v 取 min + if(Mx[o]<=v) return;if(L<=l&&r<=R&&Sx[o]>1;PD(o),L<=u&&(U(L,R,v,LT),0),R>u&&(U(L,R,v,RT),0),PU(o); + } + int Q(int x,PT) { // 單點詢問被修改次數 + if(l==r) return G[o];int u=l+r>>1;PD(o);return x<=u?Q(x,LT):Q(x,RT); + } +}S; +int main() { + int i;for(read(n,Qt),i=1;i<=n;++i) read(a[i]),ti[i]=1; + int op,x,y,nw=1;for(i=1;i<=Qt;++i) if(read(op),op==2) q[nw].p=nw,read(q[nw++].x); + else read(x),ti[x]^nw&&(s[++ct]=(Data){x,a[x],ti[x],nw-1},ti[x]=nw),read(a[x]); + for(i=1;i<=n;++i) ti[i]^nw&&(s[++ct]=(Data){i,a[i],ti[i],nw-1},0); + int p1=1,p2=1;for(sort(s+1,s+ct+1),sort(q+1,q+nw),S.Bd(),i=n;i;--i) //從後往前加入每個位置上的元素 + {while(p1<=ct&&s[p1].x==i) S.U(s[p1].l,s[p1].r,s[p1].v),++p1;while(p2^nw&&q[p2].x==i) ans[q[p2].p]=S.Q(q[p2].p),++p2;} + for(i=1;i^nw;++i) writeln(ans[i]);return 0; +} +``` + +
+ > [Codeforces 438D The Child and Sequence](https://codeforces.com/contest/438/problem/D) > > 給定一個序列 \\( a_i \\),並對其進行 \\( m \\) 筆操作。操作有三種: > > 1. 給定 \\( l, r \\),請輸出區間總和 \\( a[l]+...+a[r] \\) > 2. 給定 \\( l, r \\),對區間 \\( [l, r] \\) 的每一個數取模,即 \\( a_i = a_i mod x \\) -> 3. 給定 \\( k, x \\),將 \\( a[k] \\) 的值改為 \\( x \\) +> 3. 給定 \\( k, x \\),將 \\( a_k \\) 修改為 \\( x \\) + +
Solution 我們在這題只需要總和 \\( sum \\)、最大值\\( max \\)。`update_mod` 處理操作 \\( 2 \\),`update_set` 處理操作 \\( 3 \\)。 @@ -1158,23 +1236,29 @@ int main() { } ``` +
+ > [洛谷 P6242【模板】線段樹 3](https://www.luogu.com.cn/problem/P6242) > > 給定一個序列 \\( A_i \\)、輔助序列 \\( B_i \\),並對其進行 \\( m \\) 筆操作。操作有三種: > -> 1. 給定 \\( l, r, k \\),對區間\\( [l, r] \\)的每一個數加上 \\( k \\),即 \\( A_i = A_i + k \\) -> 2. 給定 \\( l, r, v \\),對區間 \\( [l, r] \\) 的每一個數取最小值,即\\( A_i = min(A_i, v) \\) -> 3. 給定 \\( l, r \\),請輸出區間總和\\( a[l]+...+a[r] \\) -> 4. 給定 \\( k, x \\),對於區間 \\( [l, r] \\) 的每個 \\( i \\),請輸出 \\( A_i \\) 的最大值 -> 5. 給定 \\( l, r \\),對於區間 \\( [l, r] \\) 的每個 \\( i \\),請輸出 \\( B_i \\) 的最大值 +> 1. 給定 \\( l, r, k \\),對區間\\( [l, r] \\)的每一個數加上 \\( k \\),即 \\( A_i = A_i + k \\)。 +> 2. 給定 \\( l, r, v \\),對區間 \\( [l, r] \\) 的每一個數取最小值,即\\( A_i = min(A_i, v) \\)。 +> 3. 給定 \\( l, r \\),對所有 \\( i \in [l, r] \\),輸出\\( \sum_{i = l}^{r} A_i \\)。 +> 4. 給定 \\( k, x \\),對於區間 \\( [l, r] \\) 的每個 \\( i \\),請輸出 \\( A_i \\) 的最大值。 +> 5. 給定 \\( l, r \\),對於區間 \\( [l, r] \\) 的每個 \\( i \\),請輸出 \\( B_i \\) 的最大值。 > -> 每次操作後,將 \\( B_i \\) 設為 \\( max($B_i$, $A_i$) \\) +> 每次操作後,將 \\( B_i \\) 設為 \\( max(B_i, A_i) \\) > > - \\( 1 \leq n, m \leq 5 \times 10^5 \\) > - \\( -5 \times 10^8 \leq A_i \leq 5 \times 10^8 \\) > - \\( -2000 \leq k \leq 2000 \\) > - \\( -5 \times 10^8 \leq v \leq 5 \times 10^8 \\) +
Solution + +這題只是將例題 \\( 6 \\) 的 \\( min \\) 改成 \\( max \\),並增加詢問區間和的操作而已。 + ```cpp #include using namespace std; @@ -1276,13 +1360,17 @@ int main() { } ``` +
+ > [Codeforces 1290E Cartesian Tree](https://codeforces.com/problemset/problem/1290/E) > -> 給定一個長度為 \\( n \\) 的序列\\( a_i \\),對於區間 \\( [1, n] \\) 的每個 \\( k \\),用前\\( k \\) 小的值建造笛卡爾樹,求所有子樹大小的總和。 +> 給定一個長度為 \\( n \\) 的序列\\( a_i \\),對於區間 \\( [1, n] \\) 的每個 \\( k \\),用前 \\( k \\) 小的值建造笛卡爾樹,求所有子樹大小的總和。 > > - \\( 1 \leq n \leq 150000 \\) -\\( l_i, r_i \\) 分別為 \\( a_i \\) 左右最後一個比其小的數的位置,節點 \\( i \\) 的子樹大小為 \\( r_i - l_i + 1 \\)。分開維護 \\( l_i \\) 和 \\( r_i \\),以 \\( r_i \\) 為例,當 \\( k \\) 增加 \\ ( 1 \\),\\( k+1 \\) 插入序列時,\\( pos_{k+1} \\) 左側的 \\( r_i \\) 被更新成 \\( min(r_i, pos_{k+1}) \\),右側的 \\( r_i \\) 被更新成 \\( r_i+1 \\)。可以使用 STB 維護區間總和。 +
Solution + +\\( l_i, r_i \\) 分別為 \\( a_i \\) 左右最後一個比其小的數的位置,節點 \\( i \\) 的子樹大小為 \\( r_i - l_i + 1 \\)。分開維護 \\( l_i \\) 和 \\( r_i \\),以 \\( r_i \\) 為例,當 \\( k \\) 增加 \\( 1 \\),\\( k+1 \\) 插入序列時,\\( pos_{k+1} \\) 左側的 \\( r_i \\) 被更新成 \\( min(r_i, pos_{k+1}) \\),右側的 \\( r_i \\) 被更新成 \\( r_i+1 \\)。可以使用 STB 維護區間總和。 時間複雜度是\\( O(nlog^2n) \\)。 @@ -1411,17 +1499,21 @@ int main() { } ``` +
+ > [Codeforces 1572F Stations](https://codeforces.com/problemset/problem/1572/F) > > 給定 \\( n \\) 座城市,每座城市有 \\( 2 \\) 個屬性 \\( h_i, w_i \\),第 \\( i \\) 座城市可以向第 \\( j \\) 座城市廣播,如果對於所有的 \\( k \\) 在區間 \\( [i, j] \\) 中,滿足 \\( max{h_k} < h_i\\)。一開始 \\( h_i = 0 \\) 且 \\( w_i = i \\)。 > -> 其發生 \\( q \\) 次事件,事件有 \\( 2 \\) 種: +> 其發生 \\( q \\) 次事件,事件有兩種: > > 1. 給定 \\( c_i, g_i \\),將城市 \\( c_i \\) 的 \\( h \\) 變成全局嚴格最大值,並修改其 \\( w \\) 為 \\( g_i \\) > 2. 給定 \\( l_i, r_i \\),請輸出區間 \\( [l_i, r_i] \\) 的每座城市可以覆蓋到的城市數量 \\( b_i \\) 之總和 > > - \\( 1 \leq n \leq 200000 \\) +
Solution + 每個城市覆蓋的區域是一個從 \\( i \\) 開始的區間,而維護區間右端點是一個單點修改,區間取 \\( min \\) 問題,另外用一棵線段樹維護區間覆蓋,因為 STB 裡可直接對值進行修改,所以修改時可以順帶在另一棵線段樹上進行區間修改,即打\\( tag \\) 時維護即可。詢問時直接在線段樹查詢區間和。 時間複雜度是 \\( O(nlog^2n) \\)。 @@ -1530,6 +1622,8 @@ int main() { } ``` +
+ ## References 底下的資源包含許多例題,同學可以去參考看看。 @@ -1539,5 +1633,9 @@ int main() { - [Segment Tree Beats 学习笔记](https://www.cnblogs.com/Neal-lee/p/15695984.html) - [Historic Information on Segment Trees](https://mzhang2021.github.io/cp-blog/historic-segtree) - [《区间最值操作与历史最值问题》- 国家集训队 2016 论文集](https://github.com/enkerewpo/OI-Public-Library/blob/master/IOI中国国家候选队论文/国家集训队2016论文集.pdf) +- [区间最值操作 & 区间历史最值 - OI Wiki](https://oi-wiki.org/ds/seg-beats) +- [区间最值操作与区间历史最值详解](https://www.luogu.com.cn/blog/Hakurei-Reimu/seg-beats) +- [《区间最值操作与历史最值问题》- 学习笔记](https://www.cnblogs.com/p-b-p-b/p/14632059.html) +- [Segment Tree Beats! 初步和其他](https://www.cnblogs.com/CDOI-24374/p/17246482.html) [^note-1]: [2016 集训队论文 - 吉如一《区间最值操作与历史最值问题》](http://www.doc88.com/p-6744902151779.html)