Loading docs/ds/segment-tree-beats.md +14 −8 Original line number Diff line number Diff line Loading @@ -136,7 +136,7 @@ signed main(){ 3. 对一个结点取 v 的 $\min$(这里忽略暴搜的过程,假定标记满足添加的条件),除了更新卫星信息,我们要与区间 $\max$ 的标记做比较。如果 v 小于区间 $\max$ 的标记,则所有的数最后都会变成 v,那么把区间 $\max$ 的标记也变成 v。否则不管。 4. 区间取 v 的 $\max$ 同理。 另外,BZOJ 这道题卡常...... 多数组线段树的常数比结构体线段树的常数大...... 在维护信息的时侯,当只有一两个数的时侯可能发生数集重合,比如一个数既是最大值又是次小值。这种要特判。 另外,BZOJ 这道题卡常……多数组线段树的常数比结构体线段树的常数大……在维护信息的时侯,当只有一两个数的时侯可能发生数集重合,比如一个数既是最大值又是次小值。这种要特判。 ```cpp ##include<cstdio> Loading Loading @@ -310,7 +310,7 @@ int main(){ > 3. 对 A 做区间加 > 4. 询问 B 的区间和 > > 每次操作完后,如果 $A_i$ 的值发生变化,就给 $B_i$ 加 1. $n,m\le 3\times 10^5$。 > 每次操作完后,如果 $A_i$ 的值发生变化,就给 $B_i$ 加 1。 $n,m\le 3\times 10^5$。 先考虑最容易的区间加操作。只要 $x\neq 0$ 那么整个区间的数都变化,所以给 B 作一次区间加即可。 Loading Loading @@ -347,9 +347,11 @@ CTSN?赤兔少年。吃土少年。 #### 历史最大值 简单地说,一个位置的历史最大值就是当前位置下曾经出现过的数的最大值。形式化地定义,我们定义一个辅助数组 B,一开始与 A 完全相同。在 A 的每次操作后,我们对整个数组取 Max $$ \forall i\in[1,n],\ B_i=\max(B_i,A_i) $$ 这时,我们将 $B_i$ 称作这个位置的历史最大值, #### 历史最小值 Loading @@ -359,9 +361,11 @@ $$ #### 历史版本和 辅助数组 B 一开始全部是 0。在每一次操作后,我们把整个 A 数组累加到 B 数组上 $$ \forall i\in[1,n], \ B_i=B_i+A_i $$ 我们称 $B_i$ 为 i 这个位置上的历史版本和。 接下来,我们将历史最值问题分成四类讨论。 Loading @@ -372,14 +376,14 @@ $$ > 序列 AB 一开始相同: > > 1. 对 A 做区间覆盖 x > 2. 对 A 做区间加 x > 3. 询问 A 的区间 Max > 4. 询问 B 的区间 Max > 1. 对 A 做区间覆盖 $x$ > 2. 对 A 做区间加 $x$ > 3. 询问 A 的区间 $\max$ > 4. 询问 B 的区间 $\max$ > > 每次操作后,我们都进行一次更新,$\forall i\in [1,n],\ B_i=\max(B_i,A_i)$。$n,m\le 10^5$。 我们先不考虑操作 1. 那么只有区间加的操作,我们维护标记 Add 表示当前区间增加的值,这个标记可以解决区间 $\max$ 的问题。 接下来考虑历史区间 Max。我们定义标记 Pre,该标记的含义是:在该标记的生存周期内,Add 标记的历史最大值。 我们先不考虑操作 1。 那么只有区间加的操作,我们维护标记 Add 表示当前区间增加的值,这个标记可以解决区间 $\max$ 的问题。 接下来考虑历史区间 Max。我们定义标记 Pre,该标记的含义是:在该标记的生存周期内,Add 标记的历史最大值。 这个定义可能比较模糊。因此我们先解释一下标记的生存周期。一个标记会经历这样的过程: Loading @@ -392,9 +396,11 @@ $$ 为什么要定义生存周期?利用这个概念,我们可以证明:在一个结点标记的生存周期内,其子结点均不会发生任何变化,并保留在这个生存周期之前的状态。道理很简单,因为在这个期间你是没有下传标记的。 于是,你就可以保证,在当前标记生存周期内的历史 Add 的最大值是可以更新到子结点的标记和信息上的。因为子结点的标记和信息在这个时间段内都没有变过。于是我们把 u 的标记下传给它的儿子 s,不难发现 $$ Pre_s=\max(Pre_s,Pre_u+Add_s),Add_s=Add_u+Add_s $$ 那么信息的更新也是类似的,拿对应的标记更新即可。 接下来,我们考虑操作 1。 Loading Loading
docs/ds/segment-tree-beats.md +14 −8 Original line number Diff line number Diff line Loading @@ -136,7 +136,7 @@ signed main(){ 3. 对一个结点取 v 的 $\min$(这里忽略暴搜的过程,假定标记满足添加的条件),除了更新卫星信息,我们要与区间 $\max$ 的标记做比较。如果 v 小于区间 $\max$ 的标记,则所有的数最后都会变成 v,那么把区间 $\max$ 的标记也变成 v。否则不管。 4. 区间取 v 的 $\max$ 同理。 另外,BZOJ 这道题卡常...... 多数组线段树的常数比结构体线段树的常数大...... 在维护信息的时侯,当只有一两个数的时侯可能发生数集重合,比如一个数既是最大值又是次小值。这种要特判。 另外,BZOJ 这道题卡常……多数组线段树的常数比结构体线段树的常数大……在维护信息的时侯,当只有一两个数的时侯可能发生数集重合,比如一个数既是最大值又是次小值。这种要特判。 ```cpp ##include<cstdio> Loading Loading @@ -310,7 +310,7 @@ int main(){ > 3. 对 A 做区间加 > 4. 询问 B 的区间和 > > 每次操作完后,如果 $A_i$ 的值发生变化,就给 $B_i$ 加 1. $n,m\le 3\times 10^5$。 > 每次操作完后,如果 $A_i$ 的值发生变化,就给 $B_i$ 加 1。 $n,m\le 3\times 10^5$。 先考虑最容易的区间加操作。只要 $x\neq 0$ 那么整个区间的数都变化,所以给 B 作一次区间加即可。 Loading Loading @@ -347,9 +347,11 @@ CTSN?赤兔少年。吃土少年。 #### 历史最大值 简单地说,一个位置的历史最大值就是当前位置下曾经出现过的数的最大值。形式化地定义,我们定义一个辅助数组 B,一开始与 A 完全相同。在 A 的每次操作后,我们对整个数组取 Max $$ \forall i\in[1,n],\ B_i=\max(B_i,A_i) $$ 这时,我们将 $B_i$ 称作这个位置的历史最大值, #### 历史最小值 Loading @@ -359,9 +361,11 @@ $$ #### 历史版本和 辅助数组 B 一开始全部是 0。在每一次操作后,我们把整个 A 数组累加到 B 数组上 $$ \forall i\in[1,n], \ B_i=B_i+A_i $$ 我们称 $B_i$ 为 i 这个位置上的历史版本和。 接下来,我们将历史最值问题分成四类讨论。 Loading @@ -372,14 +376,14 @@ $$ > 序列 AB 一开始相同: > > 1. 对 A 做区间覆盖 x > 2. 对 A 做区间加 x > 3. 询问 A 的区间 Max > 4. 询问 B 的区间 Max > 1. 对 A 做区间覆盖 $x$ > 2. 对 A 做区间加 $x$ > 3. 询问 A 的区间 $\max$ > 4. 询问 B 的区间 $\max$ > > 每次操作后,我们都进行一次更新,$\forall i\in [1,n],\ B_i=\max(B_i,A_i)$。$n,m\le 10^5$。 我们先不考虑操作 1. 那么只有区间加的操作,我们维护标记 Add 表示当前区间增加的值,这个标记可以解决区间 $\max$ 的问题。 接下来考虑历史区间 Max。我们定义标记 Pre,该标记的含义是:在该标记的生存周期内,Add 标记的历史最大值。 我们先不考虑操作 1。 那么只有区间加的操作,我们维护标记 Add 表示当前区间增加的值,这个标记可以解决区间 $\max$ 的问题。 接下来考虑历史区间 Max。我们定义标记 Pre,该标记的含义是:在该标记的生存周期内,Add 标记的历史最大值。 这个定义可能比较模糊。因此我们先解释一下标记的生存周期。一个标记会经历这样的过程: Loading @@ -392,9 +396,11 @@ $$ 为什么要定义生存周期?利用这个概念,我们可以证明:在一个结点标记的生存周期内,其子结点均不会发生任何变化,并保留在这个生存周期之前的状态。道理很简单,因为在这个期间你是没有下传标记的。 于是,你就可以保证,在当前标记生存周期内的历史 Add 的最大值是可以更新到子结点的标记和信息上的。因为子结点的标记和信息在这个时间段内都没有变过。于是我们把 u 的标记下传给它的儿子 s,不难发现 $$ Pre_s=\max(Pre_s,Pre_u+Add_s),Add_s=Add_u+Add_s $$ 那么信息的更新也是类似的,拿对应的标记更新即可。 接下来,我们考虑操作 1。 Loading