P10145 [WC2024] 线段树 题解
\(\mathcal O(4^{n})\) 做法
对于线段树上的一个节点区间 \([l,r)\) 我们连无向边 \((l,r)\),那么可以用加减表示出一个区间 \([L,R)\) 等价于 \(L,R\) 两点联通。
于是可以枚举每条边选或不选,用可撤销并查集判断两点是否联通,复杂度 \(\mathcal O(2^{2n-1}\alpha(n))\approx\mathcal O(4^n)\)。
特殊性质做法
特殊性质就是整个图联通。对与线段树上的每个区间,令 \(f_o,g_o\) 分别表示区间联通与不连通的方案数,有:
\[f_o=2f_{ls}f_{rs}+f_{ls}g_{rs}+f_{rs}g_{ls}\\ g_o=f_{ls}g_{rs}+f_{rs}g_{ls} \]在“线段树”上转移即可。
----------------------------------思路分界线---------------------------------------
\(\mathcal O(n^2m)\) 做法
因为我们不再需要让整个图联通,所以不能简单的记录是否联通,由于每次增加一个大区间,总是把最左边的与最右边的联通,所以我们记 \(f_o\) 表示区间联通,\(g_{o,j}\) 表示区间不连通且 左端点最远与 \(j\) 联通的方案数,则:
\[\begin{aligned} &f_{ls}f_{rs}\to f_o\\ &f_{ls}g_{rs,j}\to f_o,f_{ls}g_{rs,j}\to g_{o,j}\\ &g_{ls,j}f_{rs}\to f_o,g_{ls,j}f_{rs}\to g_{o,j}\\ &g_{ls,j}g_{rs,k}\to f_o,g_{ls,j}g_{rs,k}\to g_{o,j} \end{aligned} \]对于第四组转移,区间 \((j,k)\) 在也无法与外界联通,所以转移时要求每个需要确定的区间 \([L,R)\) 要么都在里面,要么都在外面。
最后答案就是 \(f_{root}+g_{root,i}\),其中 \(i\) 满足每个 \([L,R)\) 要么都在 \([0,i)\) 里面,要么都在 \([0,i)\) 外面,直接转移+枚举 \([L,R)\) 做到 \(\mathcal O(n^2m)\)。
\(\mathcal O(n^2)\) 做法
对于每个 \([L,R)\) ,使用异或Hash,随机一个权值 \(v\),\(q_L\oplus v\to q_L,q_R\oplus v\to q_R\),最后令 \(V\) 表示 \(q\) 的前缀异或和,那么第四组的转移限制相当于要求 \(V_j=V_k\),这样避免了直接枚举限制。
\(\mathcal O(n\log n)\) 做法
直接将转移中的 \(j\) 替换成 \(V_j\) 那么转移变成了:
\[\begin{aligned} &f_{ls}f_{rs}\to f_o\\ &f_{ls}g_{rs,j}\to f_o,f_{ls}g_{rs,j}\to g_{o,j}\\ &g_{ls,j}f_{rs}\to f_o,g_{ls,j}f_{rs}\to g_{o,j}\\ &g_{ls,j}g_{rs,j}\to f_o,g_{ls,j}g_{rs,j}\to g_{o,j} \end{aligned} \]可以用线段树合并解决,复杂度 \(\mathcal O(n\log n)\)。