支配对小记

支配对先考虑对询问的影响然后套路的考虑点对 \((i,j),(j,k),(i,k),i<j<k\) 使得 \((i,k)\) 不被另两个点对支配需满足的限制,找性质。

对于树上问题,若关于路径考虑点分治,其他的可以尝试 dsu on tree。

P7880 [Ynoi2006] rldcot

dsu on tree+树上支配对。

对于一个点 \(u\),若 \(u\) 要统计入询问,则要求满足 \(i,j\in tree_u,l\le i,j\le r\)。合并时,对于点 \(i\) 只需要找到其在其他子树内的前驱后继 \(pre_i,suf_i\),因为 \((pre_i,i,dep(u)),(i,suf_i,dep(u))\) 是对 \(l,r\) 限制最宽松的,若其他含 \(i\) 的点对满足询问答案,则这两对点中必定有至少一对满足。

询问转化为对于每种 \(dep\) 只要存在点对 \((x,y,dep)\) 满足 \(l\le x\le y\le r\) 即可统计入答案。

然后把这些点对 \((x,y)\)\(dep(lca(x,y))\) 分类,对每一类内的点对排序作,询问离线下来作扫描线。对于右端点 \(r\),维护点对的最大左端点 \(L\)。然后对于询问 \([l,r]\) 就是查询有多少种 \(dep\)\(L\ge l\),树状数组维护后缀和即可。

CF765F Souvenirs

序列支配对。

首先把绝对值分讨一下,钦定 \(i<j,a_i>a_j\),然后 \(a_i\to MAX-a_i\) 再跑一遍即可。

考虑任意点对 \((i,j),(j,k),(i,k)\;i<j<k,\;a_i,a_j>a_k\),若 \((i,k)\) 不被另两个点对支配,则满足 \(a_i-a_k<a_j-a_k\wedge a_i-a_k<|a_i-a_j|\)。第一个限制是 \(a_i<a_j\),则第二个限制变为 \(a_i-a_k<a_j-a_i\to 2a_i<a_j+a_k\to a_i<\frac{a_j+a_k}{2}\)

所以对于固定右端点 \(k\),当前左端点为 \(j\),要找到下一个不被支配的点对 \((i,k)\) 则需要 \(i\) 满足 \(a_k\le a_i<\frac{a_j+a_k}{2}\) 所以左端点个数是 \(O(\log n)\) 级别的。

于是将询问离线扫描线,对于每个右端点往左跳有效的左端点,以左端点为下标插入树状数组,询问 \([l,r]\) 即为右端点为 \(r\) 时,查询 \(\ge l\) 的最大值。

Minimum Xor On Segment

给定序列 \(a\)\(m\) 次询问 \([l,r]\)\(\min_{i=l}^r\min_{j=i+1}^r a_i\oplus a_j\)

看到异或往 01 trie 上考虑。

同样的,考虑任意点对 \((i,j),(j,k),(i,k),i<j<k\),若 \((i,k)\) 不被另两个点对支配,即满足 \(a_i\oplus a_k< a_i \oplus a_j\wedge a_i\oplus a_k<a_j\oplus a_k\)

异或比较,套路的考虑第一个二进制上不同的位置,
\(a_i,a_j\)\(a_k\) 第一个二进制上不同的位置不同,无法判断上面第一个限制的。

\(a_i,a_j\)\(a_k\) 第一个二进制上不同的位置相同,则 \((i,k)\) 必定为无用状态(因为此时 \(a_i\oplus a_j<a_i\oplus a_k\)\((i,j)\) 显然能对更多询问造成贡献)。即对于在二进制第 \(x\) 位第一个与 \(a_k\) 不同所有 \(a\),其中最大编号为 \(j\),那么只有 \((j,k)\) 是有效状态,枚举哪一位第一个与 \(a_k\) 不同找到编号最大的即可,这个 01 trie 维护是简单的。

那么有效状态是 \(O(n\log n)\) 量级,询问与上一题一样离线+树状数组维护后缀最小值。

P9058 [Ynoi2004] rpmtdq

点分治+支配对。

树上距离考虑点分治,先考虑所有经过当前重心的路径。假设点 \(u\) 到重心的距离是 \(d_u\),那么路径 \(u\to v\) 长度就是 \(d_u+d_v\)(在同一子树内的点对距离不满足,但在同一子树内的点对显然在更深层的分治统计过了)。

支配对套路地考虑对于任意点对 \((i,j),(i,k),(j,k),i<j<k\),若 \((i,k)\) 不被另两个点对支配,则需要满足 \(dis(i,k)<dis(i,j)\wedge dis(i,k)<dis(j,k)\)。即 \(d_i+d_k<d_i+d_j\to d_k<d_j\),\(d_i+d_k<d_j+d_k\to d_i<d_j\)

所以就是要满足 \(\max(d_i,d_k)<\min_{j=i+1}^{k-1}d_j\)

假设 \(d_k>d_i\)。则每个点只与满足此条件且编号最大的点组成的点对是有效的(若 \(i,j,k,i<j<k\) 其中 \((i,k),(j,k)\) 均满足条件,那么可以得到 \(\max(d_i,d_k)<d_j\) 所以 \(d_j+d_k>d_i+d_k\)\((i,k)\) 一定更劣)。

\(d_k<d_i\),由上文同理可得只用往满足条件且编号最小的点组成点对即可。

所以在每层分治时,按 \(d\) 从小到大维护单调栈,对于每个 \(d_k\) 找到 \(d_i<d_k\)\(i\) 最大与 \(d_j<d_k\)\(j\) 最小,最后加入有效点对 \((i,k),(k,j)\)

而对于询问也是套路的扫描线+树状数组维护后缀最小值。时间复杂度是 \(O(n\log n)\)

树上启发式合并应该也能做到 \(O(n\log^2n)\) 的,大抵是卡不过去的。

P8528 [Ynoi2003] 铃原露露

首先 \(i\to a_i\),询问转化为有多少 \((l,r)\) 满足 \(L\le l\le r\le R\wedge (\forall l\le u,v\le r,L\le lca(u,v)\le R)\)

这种询问很显然是历史版本和维护(?)。

树上问题考虑 dsu on tree。

考虑 \((u,v,w)\) 表示点 \(lca(u,v)=w\) 对询问的贡献。

1.\(u\le w\le v\)

显然没有影响,始终成立。

  1. \(w>v\)

\(l\le u,r\in[v,w)\) 时不成立。

  1. \(w<u\)

\(l\in (w,u],r\ge v\) 时不成立。

套路地考虑点对 \((i,j),(j,k),(i,k),i<j<k\) 使得 \((i,k)\) 不被另两个点对支配,只有 \(lca(i,k)\ne lca(i,j)\wedge lca(i,k)\ne lca(j,k)\)。因为 \((i,k)\) 包含了另两个点对,按照上文三种情况,影响均会被另两个点对包含 (第 2 种情况被 \((i,j)\) 包含,第 3 种情况被 \((j,k)\) 包含)。

所以在 \(u\) 合并子树时,对于每个点 \(i\) 都只用找其在其他子树的前驱后继,这样有效点对数量为 \(O(n\log n)\)

找到有效点对,考虑怎么询问,右端点扫描线,维护合法左端点数量。上文有提到这类询问一般都是历史版本和,而每个有效点对对于左端点是否合法的影响是个区间。

于是可以想到,每个有效点对的操作就是对其影响为不合法的左端点区间 +1,查询即为区间 \([l,r]\) 历史版本中 0 的个数之和。

posted @ 2025-10-16 09:26  Uesugi1  阅读(12)  评论(0)    收藏  举报