一些 DS
如题。
登山计划
给定两个长为 \(n\) 的序列 \(a,b\),\(Q\) 次询问,给定 \(L,R,k\),求:
\[\min_{L \leq l \leq r \leq R \wedge r-l+1=k} |\min_{i=l}^{r} a_i- \min_{i=l}^{r} b_i| \]\(n \leq 2\times 10^5,Q \leq 5\times 10^5\)
不妨先思考若 \(L=1,R=n\) 怎么做。考虑分治。
对于当前分治中心 \(mid,mid+1\),记: \(la_i = min_{j=i}^{mid} a_j,ra_i = min_{j=mid+1}^{i} a_j,lb_i = min_{j=i}^{mid} b_j,rb_i = min_{j=mid+1}^{i} b_j\),
那么一段区间 \([l,r]\) 的答案可以描述为 \(|min(la_l,ra_r) - min(lb_l,rb_r)|\),由于前缀 min 单调不增,后缀 min 单调不减,转化为静态 RMQ 问题后不难 \(O(n\log^2 n)\) 求出。
而对于所有的 \(L,R\),考虑采用线段树分治的方式,给所有跨过对应分治中心 \(mid,mid+1\) 的节点都挂上这个询问。对于整的被覆盖的节点,上文已经在 \(O(n\log n)\) 内求出了所有答案。而对于没有被完全覆盖的节点,其计算答案和正常分治只有一些取值范围的差别,故我们可以直接调用分治时的信息 \(O(1)\) 求出。这样挂的节点数一共是 \(O(\log n)\) 的,回答是 \(O(1)\) 的,总复杂度 \(O(n \log^2 n+Q \log n)\)。
苦涩
你需要维护 \(n\) 个初始为空的可重集,支持一下三个操作:
- 对 \([l,r]\) 中的集合插入一个数 \(k\)。
- 记 \(x\) 为 \([l,r]\) 中所有可重集的所有数的最大值,对所有 \([l,r]\) 含有 \(x\) 的集合删去一个 \(x\)。
- 查询 \([l,r]\) 中所有可重集的所有数的最大值。
\(n,Q \leq 10^5,k \leq 10^9\)
第二个删除的操作特别麻烦。
每次我们是对一个区间加数,并且删除的时候只删除最大的那个数。利用标记永久化的思想,在每个点维护一个最大值和一个优先队列,优先队列里存的是当前区间内每个点都被加到的数。
这样我们删除的时候直接在对应节点的优先队列上删除就可以了,而对于多删的点,我们两侧递归把其补全。这里本节点的深度加上递归下去补全的深度一共是 \(O(\log n)\),算上优先队列,总复杂度为 \(O(Q \log^2 n)\)。

浙公网安备 33010602011771号