Loading docs/ds/divide-combine.md +5 −0 Original line number Diff line number Diff line Loading @@ -128,20 +128,25 @@ $$ #### 判断能否合并 最后,我们考虑如何处理 $L$ 数组。事实上,一个连续段 $(P,[l,r])$ 等价于区间极差与区间长度 -1 相等。即 $$ \max_{l\le i\le r}P_i-\min_{l\le i\le r}P_i=r-l $$ 而且由于 P 是一个排列,因此对于任意的区间 $[l,r]$ 都有 $$ \max_{l\le i\le r}P_i-\min_{l\le i\le r}P_i\ge r-l $$ 于是我们就维护 $\max_{l\le i\le r}P_i-\min_{l\le i\le r}P_i-(r-l)$,那么要找到一个连续段相当于查询一个最小值! 有了上述思路,不难想到这样的算法。对于增量过程中的当前的 i,我们维护一个数组 $Q$ 表示区间 $[j,i]$ 的极差减长度。即 $$ Q_j=\max_{j\le k\le i}P_k-\min_{j\le k\le i}P_k-(i-j),\ \ 0<j<i $$ 现在我们想知道在 $1\sim i-1$ 中是否存在一个最小的 $j$ 使得 $Q_j=0$。这等价于求 $Q_{1\sim i-1}$ 的最小值。求得最小的 j 就是 $L_i$。如果没有,那么 $L_i=i$。 但是当第 i 次增量结束时,我们需要快速把 $Q$ 数组更新到 i+1 的情况。原本的区间从 $[j,i]$ 变成 $[j,i+1]$,如果 $P_{i+1}>\max$ 或者 $P_{i+1}<\min$ 都会造成 $Q_j$ 发生变化。如何变化?如果 $P_{i+1}>\max$,相当于我们把 $Q_j$ 先减掉 $\max$ 再加上 $P_{i+1}$ 就完成了 $Q_j$ 的更新;$P_{i+1}<\min$ 同理,相当于 $Q_j=Q_j+\min-P_{i+1}$. Loading Loading
docs/ds/divide-combine.md +5 −0 Original line number Diff line number Diff line Loading @@ -128,20 +128,25 @@ $$ #### 判断能否合并 最后,我们考虑如何处理 $L$ 数组。事实上,一个连续段 $(P,[l,r])$ 等价于区间极差与区间长度 -1 相等。即 $$ \max_{l\le i\le r}P_i-\min_{l\le i\le r}P_i=r-l $$ 而且由于 P 是一个排列,因此对于任意的区间 $[l,r]$ 都有 $$ \max_{l\le i\le r}P_i-\min_{l\le i\le r}P_i\ge r-l $$ 于是我们就维护 $\max_{l\le i\le r}P_i-\min_{l\le i\le r}P_i-(r-l)$,那么要找到一个连续段相当于查询一个最小值! 有了上述思路,不难想到这样的算法。对于增量过程中的当前的 i,我们维护一个数组 $Q$ 表示区间 $[j,i]$ 的极差减长度。即 $$ Q_j=\max_{j\le k\le i}P_k-\min_{j\le k\le i}P_k-(i-j),\ \ 0<j<i $$ 现在我们想知道在 $1\sim i-1$ 中是否存在一个最小的 $j$ 使得 $Q_j=0$。这等价于求 $Q_{1\sim i-1}$ 的最小值。求得最小的 j 就是 $L_i$。如果没有,那么 $L_i=i$。 但是当第 i 次增量结束时,我们需要快速把 $Q$ 数组更新到 i+1 的情况。原本的区间从 $[j,i]$ 变成 $[j,i+1]$,如果 $P_{i+1}>\max$ 或者 $P_{i+1}<\min$ 都会造成 $Q_j$ 发生变化。如何变化?如果 $P_{i+1}>\max$,相当于我们把 $Q_j$ 先减掉 $\max$ 再加上 $P_{i+1}$ 就完成了 $Q_j$ 的更新;$P_{i+1}<\min$ 同理,相当于 $Q_j=Q_j+\min-P_{i+1}$. Loading