CF1270H 题解

· · 题解

Number of Components

联通块数显然很难直接维护,考虑发掘一些性质:连通块必然是 a 上一段区间。

证明:若存在 a_i<a_j,设 k \in (i,j)。分类讨论。

证明完结论后,问题转化为计算 Ans=\sum\limits_{i\in[1,n)}[\min\limits_{j\in[1,i]}a_j>\max\limits_{j\in(i,n]}a_j]

注意到 a_i\le10^6 且互不相同,考虑统计所有 v=\max\limits_{j\in(i,n]}a_j。如果 v 能够造成贡献(合法),则 v 最多贡献 1,且 v 在序列 a 中出现。

我们对每个 v 生成 01 序列 B(v)B(v)_i=[a_i>v]。则合法的 v 生成出来的 B(v) 一定形如:111\dots1100\dots000,即 cnt_{10}(v)=1

考虑维护每个 cnt_{10}(v):若 v\in(a_i,a_{i+1}],则 B(v)_i 处会出现 10。也就是 cnt_{10}(v)=\sum_{i\in[1,n)}[a_i<v \le a_{i+1}]

我们可以开个线段树维护所有 cnt_{10}(v),节点上记录区间最小值 mx 以及当前在 a 中出现且是最小值的位置个数 cnt,如果 mx=1,则 ans+=cnt