一些 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)\)

AC Submission

posted @ 2025-11-24 23:56  Mi2uk1  阅读(14)  评论(0)    收藏  举报