联合省选 R1
https://cplusoj.com/d/senior/contest/699c5d241363e1a07691b15a
T1 哈诺伊塔 (han)
如果有一个空的柱子就可以直接归并,或者有一个柱子是 1,2,3,...,x。
那么我们需要找出一个空的柱子,即要求某个柱子 min>另一个柱子的 max。
T2 区块链 (pether)
ori:P13508 [OOI 2024] Burenka and Pether
先对于每个 \(i\) 求出不考虑 \(a_i<a_j\) 条件下,可以到达的最远的 \(p_i\)。\(O(n\log n)\) 预处理。
\(i\) 每次移动一定找到最大的 \(a_x\le a_j\),满足 \(i<x\le p_i\)。
sol1 值域分治:当前分治到 \([l,r]\),我们希望 \(a_u\le mid < a_v\) 的询问一直跳直到到 \(>mid\)。
求出 \(a_u\in[l,mid]\) 这些点下一步跳到哪里,建出一棵树。设 \(i\) 能跳到最小的 \(a_j\) 满足 \(a_j\in (mid,r]\) 等于 \(c_i\)。
显然 \(a_u\) 会一直跳直到跳出 \([l,mid]\)。假设在 \([l,mid]\) 中跳到了 \(a_T\),要求 \(c_T\le a_v\),然后找到 \(T\) 能跳到最远的 \(\le a_v\) 的值。
维护一个支持:查询区间最大值位置、单点修改的 DS 即可维护上述操作。
那么就可以递归子问题,总复杂度 \(O(n\log ^2 n)\)。
sol2 值域分块:
T3 建造军营 II (barrack)
ori:P11567 建造军营 II
题意:
给定一张图,和 \(k\) 个点对 \((a_i,b_i)\)。
你可以断掉一条边,或者保留这条边并给这条边染上红色/黑色。满足:
- 图连通。
- 每一对 \((a_i,b_i)\) 之间所有的“不走重边的路径”都只经过红边。
本题显然和边双相关,缩边双后 \(a_i\) 到 \(b_i\) 之间的路径需要标红。考虑求出某个点集 \(S\) 是边双的方案数。
边双连通-连通变换
定义 \(G=\mathtt{Trans}(F,c)\) 表示用 \(F\) 作为大点权值拼成一棵树的权值之和,边权为 \(c\)。一棵树的权值定义为所有点权值乘上所有边的权值。
考虑计算这个东西。设集合幂级数 \(f_i\) 表示点集 \(S\) 加入了 \(u,v\le i\) 的边 \((u,v)\) 后得到连通图的方案数。
当 \(i\not\in S\) 有 \(f_{i,S}=f_{i-1,S}\)。
定义集合幂级数 \(g_{i,S}=[i\not\in S]f_{i-1,S}\times \mathtt E(S\to i)\times c\),其中 \(E(S\to i)\) 表示 \(S\) 中 \(<i\) 的点有多少是向 \(i\) 有连边的。
对于 \(i\in S\) 有 \(f_{i,S}=[x^S](f_{i-1}\times \exp g_i)\)。
边界 \(f_0=F\)。复杂度 \(O(2^nn^3)\)。
设集合幂级数 \(F\) 代表连通子图的方案数。容易通过 \(\ln\) 求出。我们可以知道,\(\mathtt{Trans}(F,-1)\) 表示边双连通分量的方案数。
我们将非强制染红的边视作权值为 2,并改成灰边。
首先求出集合幂级数 \(F\) 表示红色连通子图的方案数,这可以通过 \(\mathtt{Trans}(F',-1)\) 得到。其中 \(F'\) 是连通子图的方案数,要求所有点对 \((a_i,b_i)\) 要么被点集包含,要么不在点集内部。这样做的意义就是将包含灰边的方案容斥掉。
然后是集合幂级数 \(G\) 表示灰边边双连通分量的方案数,这可以通过 \(\mathtt{Trans}(G',-2)\) 得到。其中 \(G'\) 是连通子图的方案带权值和,要求所有点对 \((a_i,b_i)\) 都不在点集内部。\(G'\) 也可以使用 \(\ln\) 求出。
最后使用 \(\mathtt{Trans}(F+G,2)\) 合并答案。注意最后 \(S\) 点集内若不包含任何 \((a_i,b_i)\),则 \(F_S=0\)。
浙公网安备 33010602011771号