ABC248Ex Beautiful Subsequences

洛谷 AT

  • 给定长度为 \(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)\)。据说二维数点的时候有更高明的桶做法,但是我太弱了不会。

提交记录(含代码)

posted @ 2023-10-25 21:15  lzyqwq  阅读(34)  评论(0)    收藏  举报