Loading

P10145 [WC2024] 线段树 题解

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

参考

笋 - 洛谷专栏

posted @ 2025-01-04 12:58  lupengheyyds  阅读(36)  评论(0)    收藏  举报