T1 构造字符串
签到题
注意到 \(n\) 和 \(m\) 较小,直接扫一遍用并查集维护他所描述的情况,并将不同的位置记录下来,若存在不同的位置属于同一个集合则不可能构成,否则贪心从前往后取 mex 即可。
时间复杂度 \(O(nm\alpha(n))\) 。
T2 寻宝
签到题
首先先用并查集将大联通块缩点,注意到 \(m\) 很小,可直接连边然后 \(bfs\) 判断连通性。
时间复杂度 \(O(nm\alpha(nm)+qk)\) 。
T3 序列
李超线段树
注意到对于给定 \(p\) ,最大时的左右端点 \(l,r\) 是相互独立的,可以分开单独求解
记 \(A_i=\sum_{j=1}^{i}a_i\ \ \ \ B_i=\sum_{j=1}^{i}b_i\)
即求
\(右=A_r-A_p-k(B_r-B_p)\)
\(\quad\ =\max_{r>=p}\{-B_r k+A_r\}-A_p+kB_p\)
\(左=A_p-A_l-k(B_p-B_l)\)
\(\quad\ =\max_{l<p}\{B_l k-A_l\}+A_p-kB_p\)
\(相加相消:左=\max_{l<=p-1}\{B_lk-A_l\}\ \ 右=\max_{r>=p}\{-B_rk+A_r\}\)
注意到是一次函数形式,\(k\) 不大,直接上李超线段树维护即可。
但 \(p\) 不是单调的,离线下类似扫描线,扫一遍一个一个加进去即可
T4 构树
计数题,二项式反演,树类问题,Cayley公式
前置知识:
-
二项式反演:\(f(n)=\sum_{i=n}\binom{i}{n}g(i) ⟺ g(n)=\sum_{i=n}(-1)^{i-n}\binom{i}{n}f(i)\)
-
Cayley公式:一个完全图有 \(n^{n-2}\) 棵无根生成树。
-
扩展Cayley公式:被确定边分为大小为 \(a_1,a_2,\cdots, a_m\) 的连通块,则有 \(n^{m-2}\prod {a_i}\) 种生成树。
-
\(shrink\_to\_fit()\):释放容器内存
题目所求即恰有 \(i(i\in[0,n-1])\) 条边属于原树边的方案数,记为 \(g(i)\)。
二项式反演套路设 \(f(i)\) 为钦定 \(i\) 条边属于原树边的方案树,\(g\) 和 \(f\) 显然满足二项式反演。
问题转移到求解 \(f(i)\)
根据扩展 Cayley公式,可以状压枚举边的情况然后直接套公式计算,时间复杂度 \(O(2^nn\alpha(n))\) 期望得分 \(65pts\)。
正解考虑公式的组合意义从而设计状态进行 \(DP\)
对于一种情况 \(ans=n^{m-2}\prod_{i=1}^{m}a_i=\frac{n^m\prod_{i=1}^{m}a_i}{n^2}\) 考虑分子的组合意义,\(n^m\) 这个东西不需要考虑直接在每个连通块中将初始值设为 \(n\) 即可求解,对于 \(\prod a_i\) 即从每个连通块中恰选一个点的方案数。
那么可以设计状态 \(dp_{i,j,0/1}\) 表示在点 \(i\) 的子树中,选择了 \(j\) 条边,点 \(i\) 所在的连通块是否已经选择一个点,树上背包转移即可。
转移方程式是朴素的,按照公式转移,注意初始值设定为 \(n\) 即可
但是本题卡空间,为了节省空间考虑状态用 \(vector\) 来存,在儿子的状态转移完成后将其 \(clear()\),然后使用 \(shrink\_to\_fit()\) 做到真正的释放内存,空间复杂度 \(O(n)\)
时间复杂度分析
\(DP\) 部分:考虑每个点被合并的次数大概是 \(\sum_{o\in tree} n-size_o\) 是 \(O(n^2)\) 级别
二项式反演部分显然是 \(O(n^2)\)
即总时间复杂度为 \(O(n^2)\)