分治优化建图
考虑建立这么一个图,对于点 \(u\),\(\forall v \le u\),若 \(a_v \le a_u\),则连一条从 \(u\) 到 \(v\) 的边。
你直接这么做的话是 \(O\left(n^2\right)\) 的,我随便拿一个从小到大排序好的序列就可以轻松把你给卡掉。于是你想一想,我们可以怎么优化呢?
欸,\(v < u \land a_v \le a_u\) 这个性质让我们想到了什么?没错,偏序。然后你想一想什么结构比较擅长处理偏序这一类问题?没错,分治。
回忆一下,我们是怎么分治求一些偏序相关的问题的?我们考虑递归地处理,假设当前处理到区间 \([l,r]\),令 \(mid=\frac{l+r}{2}\),我们先考虑递归 \([l,mid]\) 和 \([mid+1,r]\),算出这两部分的贡献并对 \(a_{l \dots mid}\) 和 \(a_{mid+1 \dots r}\) 排序。最后,我们考虑处理 \([l,mid]\) 对 \([mid+1,r]\) 的贡献。这样的话我们把这三部分的贡献加起来就是 \([l,r]\) 的答案了。
然后你想想看,我们能不能把这一方法推广到建图上呢?
答案是能的!
我们考虑处理 \([l,r]\) 之间的点的建图。还是令 \(mid=\frac{l+r}{2}\),先递归 \([l,mid]\) 和 \([mid+1,r]\),然后考虑怎么处理形如 \((u,v)\) 的连边,其中 \(u \in [r+1,mid],v \in [l,mid]\)。
这个看起来还是很不好做。但我们发现:\([l,r]\) 区间内本质不同的数最多只有 \(r-l+1\) 个。设 \([l,r]\) 之间一共有 \(k\) 个本质不同的数 \(b_{1 \dots k}\),其中 \(b_1 < b_2 < \dots b_k\)。此时,我们发现:如果我们在这一层建立 \(k\) 个虚点,其 \(i\) 个虚点表示 \(b_i\)。我们再设 \(c_i\) 表示数 \(i\) 所对应的虚点。现在,\(\forall i \in [mid+1,r]\),我们连一条从 \(i\) 到 \(c_{a_i}\) 的连边,同时 \(\forall i \in [l,mid]\),我们连一条从 \(c_{a_i}\) 到 \(i\) 的边。最后,\(\forall i \in [2,k]\),连一条从虚点 \(i\) 到虚点 \(i-1\) 的连边。于是你就发现,这个时候所有的限制都满足了!
于是就做完了。没有理解的话可以参考下图。

容易证明,此时边数点数均为 \(O\left(n \log n\right)\)。
想要例题啥的话我目前就碰到一道 AT_arc165_f,但整道题其实比较弯弯绕,在优化建图之前有一些有点难的前置结论需要得出来才能开始优化建图,如果想要更好的例题的话建议自己去找。

浙公网安备 33010602011771号