ABC248Ex Beautiful Subsequences
- 给定长度为 \(n\) 的排列 \(a_1\sim a_n\) 以及整数 \(k\),求有多少个区间 \([l,r]\) 满足 :
\[\max\limits_{i=l}^r a_i-\min\limits_{i=l}^r a_i \le r-l+k \]
- \(n \le 1.4\times 10^5\),\(k\le 3\)。
你看到这个 \(k\le 3\) 以为复杂度多少和 \(k\) 有点关系,但是我想告诉你:
两只 \(\log\) 跑得快,序列分治真可爱。
特殊性质不依赖,\(n,k\) 同阶照样快。
考虑分治,设当前分治区间为 \([L,R]\),中点 \(mid=\left\lfloor\dfrac{L+R}{2}\right\rfloor\)。考虑如何统计跨过中点的贡献。
考虑 \(mid\rightarrow L\) 扫描左端点 \(i\),统计怎样的右端点 \(j\,(j\in(mid,R])\) 合法。
预处理数组 \(pmx_x=\max\limits_{u=mid+1}^x a_u,pmn_x=\min\limits_{u=mid+1}^x a_u\)。在扫描的过程中同时记录 \(mx=\max\limits_{u=i}^{mid}a_u,mn=\min\limits_{u=i}^{mid}a_u\)。
维护两个指针 \(jmx,jmn\),使得:
-
当 \(j\in (mid,jmx)\) 时,\(\max\limits_{u=i}^j a_u = mx\);当 \(j\in [jmx,R]\) 时,\(\max\limits_{u=i}^j a_u = pmx_j\)。
-
当 \(j\in (mid,jmn)\) 时,\(\min\limits_{u=i}^j a_u = mn\);当 \(j\in [jmn,R]\) 时,\(\min\limits_{u=i}^j a_u = pmn_j\)。
不难发现当 \(\boldsymbol i\) 单调递减时,\(\boldsymbol{jmx,jmn}\) 单调不降。
分两大种、六小种情况讨论(加粗的是结论):
-
当 \(jmn\le jmx\) 时:
-
当 \(j\in(mid,jmn)\) 时,满足的条件等价于 \(mx-mn\le j-i+k\),变形成 \(j\ge mx-mn + i - k\)。
即统计有多少 \(\boldsymbol j\) 满足 \(\boldsymbol{j\in (mid,jmn)}\) 且 \(\boldsymbol{j\ge mx-mn+i-k}\)。
-
当 \(j\in [jmn,jmx)\) 时,满足的条件等价于 \(mx-pmn_j\le j-i+k\),变形成 \(j+pmn_j\ge i+mx-k\)。
即统计有多少 \(\boldsymbol{j}\) 满足 \(\boldsymbol{j\in[jmn,jmx)}\) 且 \(\boldsymbol{j+pmn_j\ge i+mx-k}\)。
-
当 \(j\in [jmx,R]\) 时,满足的条件等价于 \(pmx_j-pmn_j\le j-i+k\),变形成 \(j-pmx_j+pmn_j\ge i-k\)。
即统计有多少 \(\boldsymbol{j}\) 满足 \(\boldsymbol{j\in[jmx,R]}\) 且 \(\boldsymbol{j-pmx_j+pmn_j\ge i-k}\)。
-
-
当 \(jmn>jmx\) 时:
-
当 \(j\in(mid,jmx)\) 时,满足的条件等价于 \(mx-mn\le j-i+k\),变形成 \(j\ge mx-mn + i - k\)。
即统计有多少 \(\boldsymbol j\) 满足 \(\boldsymbol{j\in (mid,jmx)}\) 且 \(\boldsymbol{j\ge mx-mn+i-k}\)。
-
当 \(j\in[jmx,jmn)\) 时,满足的条件等价于 \(pmx_j-mn\le j-i+k\),变形成 \(j-pmx_j\ge i-mn-k\)。
即统计有多少 \(\boldsymbol j\) 满足 \(\boldsymbol{j\in [jmx,jmn)}\) 且 \(\boldsymbol{j-pmx_j\ge i-mn-k}\)。
-
当 \(j\in [jmn,R]\) 时,满足的条件等价于 \(pmx_j-pmn_j\le j-i+k\),变形成 \(j-pmx_j+pmn_j\ge i-k\)。
即统计有多少 \(\boldsymbol{j}\) 满足 \(\boldsymbol{j\in[jmn,R]}\) 且 \(\boldsymbol{j-pmx_j+pmn_j\ge i-k}\)。
-
我们发现六种情况本质上是四类统计,每一类统计都是二维数点。
具体地,建立四棵主席树 \(t1,t2,t3,t4\),分别对于每个前缀 \((mid,p]\,(p\in(mid,R])\) 版本,在节点 \([l,r]\) 内维护这个前缀中有多少个 \(j,j+pmn_j,j-pmx_j,j-pmx_j+pmn_j\) 的值在 \([l,r]\) 这个范围内。
统计的时候,先看是哪一大类,再对于三种小类,运用结论得到要统计的权值区间,并将 \(j\) 所在的范围拆成两个前缀版本相减的形式去做区间求和即可。
边界:当 \(L=R\) 时,返回 \(1\)。
时间复杂度为 \(\mathcal{O}(n\log^2 n)\),空间复杂度为 \(\mathcal{O}(n\log n)\)。据说二维数点的时候有更高明的桶做法,但是我太弱了不会。

浙公网安备 33010602011771号