胡策 sol
T1
算法一
我会暴力!
枚举每个位置放哪个兵种。
时间复杂度 \(O(\prod K_i)\),期望得分 \(10\) 分。
算法二
考虑一个暴力 dp,令 \(f_{l,r,k}\) 表示区间 \([l,r]\) 最大值为 \(k\) 时的答案,\(g_{l,r,k}\) 表示 \(f_{l,r,k}\) 的前缀最大值,转移:
时间复杂度 \(O(n^2\sum K_i)\),期望得分 \(40\) 分。
算法三
事实上我们并不需要真的保证最大值为 \(k\),因为如果 \(p\) 没有取到最大值则一定不优,因此只需要:
其中求
最大值的部分相当于在凸包上求 \(\sum Q\) 的函数值,可以预处理每个位置的凸包,然后转移时二分线段。
时间复杂度 \(O(n^2\sum \log K_i)\),期望得分 \(70\) 分。
算法四
已经呼之欲出了,考虑在算法三的基础上,改变 \(l,r,p\) 的枚举顺序,即可使 \(\sum Q\) 单调,所以只需要在凸包上扫一遍。
时间复杂度 \(O(n^3+\sum K_i \log K_i)\),常数极小,期望得分 \(100\) 分。
T2
算法一
我会暴力!
枚举每个点接在哪个点下面。
时间复杂度 \(O(n!)\),期望得分 \(10\) 分。
算法二
令 \(b_i\) 为 \(a_i\) 的前缀和,考虑计算 \(i\) 的期望深度,枚举 \(i\) 接在 \(j\) 下面
维护前缀和即可 \(O(n)\) 递推,子任务二中 \(u=1\),因此答案为 \(E(dep_v)\)。
时间复杂度 \(O(n\log V+q)\),可以通过子任务二,结合算法一,期望得分 \(30\) 分。
算法三
不妨设 \(u<v\),可以尝试枚举 \(u\) 和 \(v\) 的 LCA 为 \(x\),如果能计算出 \(x=LCA(u,v)\) 的概率 \(P(x)\),那么答案即为
枚举在 \(u\) 到 \(v\) 路径上的点,编号在 \((x,u)\) 中的点既有可能在 \(u\) 到 \(x\) 的路径上,也有可能在 \(v\) 到 \(x\) 的路径上,在 \((u,v)\) 中的点只可能在 \(v\) 到 \(x\) 的路径上。
预处理后不难做到 \(O(qn\log V)\),期望得分 \(60\) 分。
算法四
继续化简,注意到 \(a_j+b_{j-1}=b_j\),因此
只与 \(u\) 有关,于是可以预处理出 \(lca_u\) 表示 \(u\) 和 \(v(v>u)\) 的 LCA 的期望深度,不难做到 \(O(n\log V)\)。注意特判 \(u\) 为 LCA 的情况。
总时间复杂度 \(O(n\log V + q)\),期望得分 \(100\) 分。
T3
设字符串中 x 的数量为 \(c\)。
算法一
我会暴力!
枚举每个 x 是什么括号,再枚举取反哪个区间。
时间复杂度 \(O(2^cn^3)\),期望得分 \(5\) 分。
算法二
依然先枚举每个 x 是什么括号,考虑如何在 \(O(n^2)\) 的时间内 check。
首先将 ( 设为 \(1\),) 设为 \(-1\),观察到最终的字符串形如 (不取反)(取反)(不取反),我们可以设计一个 dp。
令 \(f_{i,j,k}\ (k\in \{0,1,2\})\) 表示 dp 到第 \(i\) 位,前缀和为 \(j\),\(i\) 处于第 \(k\) 段是否合法。
时间复杂度 \(O(2^cn^2)\),期望得分 \(15\) 分。
算法三
考虑在算法二的基础上进行优化,发现 dp 值只记录了 0/1,而转移时 \(j\) 的变化量为 \(1\),于是可以使用 bitset 优化。
时间复杂度 \(O(2^c\frac{n^2}{w})\),期望得分 \(25\) 分。
算法四
似乎可以枚举取反区间进行 dp,我不太清楚,但应该本质和正解相同,感兴趣的话可以自行研究一下。
时间复杂度 \(O(n^4)\),期望得分 \(55\) 分。
算法五
令 \(S_i\) 表示原括号序列的前缀和,如果取反区间 \([l,r]\) 后括号序列合法,那么 \(S_n-2(S_r-S_l)\),即 \(S_r=S_l+\dfrac{S_n}{2}\),取反后括号序列的前缀和如下:
将上述前缀和 \(\ge 0\) 分别称为条件 ①②③。
我们定义前、后缀和合法(注意后缀和还需要将左右括号取反),当且仅当全部 \(\ge 0\),那么一个括号序列合法,当且仅当前后缀和都合法。
分类讨论 \(T'\) 的前后缀和的情况。
1.前后缀和均和法
只需进行一个朴素的 dp 即可 \(O(n^2)\) 求出答案。
2.一侧合法,一侧不合法
不妨设前缀和不合法,对于后缀和不合法的情况可以将原序列反转后再求一遍。
因为后缀和合法,因此 \(S_i-S_n\ge 0\Longleftrightarrow S_n\le S_i\),所以 \(S_n\le 0\)。
条件 ③ 天然满足。
记 \(A\) 为第一个前缀和为 \(-1\) 的位置之前的最大值,\(B\) 为 \(S_n\)。
条件 ① 要求 \(l\) 要在所有 \(-1\) 之前,根据条件 ②, \(S_{l-1}\) 要尽量大,因此自然是取 \(A\) 作为 \(S_{l-1}\) 最优,然后取其后第一个 \(S_r=A+\dfrac B 2\) 的位置作为 \(r\),要求 \([l,r]\) 内前缀和均 \(\le 2A\)。
考虑枚举第一个 \(-1\) 的位置,记为 \(p\),分别计算左右两侧的方案数。
左侧比较简单,令 \(f_{i,j,k}\) 表示前 \(i\) 个括号,前缀和为 \(j\),前缀和最大值为 \(k\) 的方案数,直接 dp。
考虑右侧如何计算,若 \(A+\dfrac B 2\ge 0\),那么 \(r<p\),\([l,r]\) 内也一定 \(\le 2A\),因此条件全部满足,直接计数即可,否则,需要 \(p\) 右边存在一个合法的 \(r\),即 \([p,r]\) 内前缀和均 \(\le 2A\)。考虑将 \(p\) 后面的前缀和减去 \(B\),则要求:
- \(S'_n=0,S'_p=-1-B\)。
- \(\forall i\in [p,r],S'_i\le 2A-B=2(A-\dfrac B 2)\)。
枚举 \(A-\dfrac B 2\),即 \(S'_r\),令 \(g_{i,j,0/1}\) 表示后 \(i\) 个括号,前缀和为 \(j\),是否出现过 \(S'_r\),转移细节见代码。
3.前后缀和均不合法
记 \(A\) 为第一个 \(-1\) 之前的最大值,\(B\) 为 \(S_n\),\(C\) 为最后一次 \(B-1\) 之后的最大值。
首先,\(A\) 的位置在 \(C\) 左边,证明显然。
那么,不妨设 \(A+\dfrac B 2\le C\),否则依然可以将序列反转后再求一遍(但是注意不要把 \(A+\dfrac B 2=C\) 的部分算重)。
取 \(l-1\) 为 \(A\) 的位置,\(r\) 为最后一次 \(B-1\) 之后第一个 \(A+\dfrac B 2\),这样条件 ①③ 都已满足。
枚举第一个 \(-1\) 的位置 \(p\),左侧同上,右侧同样将最后一次 \(B-1\) 之后的前缀和减去 \(B\),则要求:
- \(S'_n=0,S'_p=-1-B\)。
- \(\forall i\in[p,r],S'_i\le 2A-B=2(A-\dfrac B 2)\)。
枚举 \(A-\dfrac B 2\),即 \(S'_r\),令 \(g_{i,j,0/1/2}\) 表示后 \(i\) 个括号,前缀和为 \(j\),处于第 \(k\) 段的方案数,\(k=0\) 表示 \([r +1,n]\),\(k=1\) 表示 \([q+1,r]\),\(k=2\) 表示 \([p,q]\),其中 \(q\) 是最后一个 \(-1\) 的位置。
时间复杂度 \(O(n^3)\),期望得分 \(100\) 分。

浙公网安备 33010602011771号