Gold
T1
对于每一行,从 \(i\) 向在 \(i\) 前面的点(包括自己)连边,那么原题转化为将给定有向图划分成若干个简单环的方案数,预处理环后 DP 即可,时间复杂度 \(\mathcal{O}(n^32^n+3^n)\)。
T2
很强的期望题,我们定义状态 \(f_{i}\) 表示 \(i\) 次询问的期望最优对多少个,显然有 \(f_{i} = \sum\limits_{j=0}^{T}p_j\times \max\{j, f_{i - 1}\}\)。
\(p_i\) 表示恰好对 \(i\) 个的概率,求出 \(\{p\}\) 的前缀和 \(\{s\}\),再预处理期望 \(e_{i} = \sum\limits_{j = i} ^ T p_j\times j\),那么转移可以写成 \(f_{i} = s_{\left\lfloor f_{i - 1}\right\rfloor} \times f_{i - 1} + e_{\left\lfloor f_{i - 1}\right\rfloor + 1}\)。
不难发现转移可以划分成 \(\mathcal{O}(T)\) 个连续段,段内转移都是相同的 \(f_{i} = kf_{i - 1} + b\),每次二分端点即可,时间复杂度 \(\mathcal{O}(T^2 + T\log k)\)。
T3
对于每个点,对于每个 \(y\) 找最近的 \(x\) 连边,然后跑最小生成树即可。
Platinum
T1
先用扫描线将矩形变为一次线段加和一次线段减。
每次线段变化时,将修改的区间内,所有的颜色段都新增一个连通块,记录到答案中。
在线段减时,要将两端的颜色段合并掉,在答案中减去。这些都可以用树状数组维护。
但是发现过不去样例二,观察一下发现样例一所有线段连通,而样例二有两个连通图。
所以我们再用 set 维护一下有多少个线段构成的连通图。总时间复杂度 \(\mathcal{O}(N\log N)\)
T2
对 \(\{a\}\) 求得前缀和 \(\{s\}\),手盘样例得到如果 \(q_i | s_n\) 则答案为 \(n+1+\dfrac{s_n}{q_i} - 2\times sum\),\(sum\) 表示 \(\{s\}\) 中有多少个 \(q_i\) 的倍数,否则无解。
直接做是 \(\mathcal{O}(QN)\),实际上还能多过几个点。
考虑优化,由于我们只用考虑 \(q_i | s_n\) 的情况,所以我们先 pollard-rho 将 \(s_n\) 分解质因数,最多就 \(10^5\) 个因数,然后高维前缀和搞一下即可,时间复杂度 \(\mathcal{O}(\omega(\sum a)\sigma(\sum a))\)。
T3
非常神的 DP。
我们定义状态 \(f_{i}\) 表示前 \(i\) 位的答案。
有三种转移,分别对应划分最后 \(1\) 位,划分最后 \(2\) 位和划分最后 \(4\) 位。
但是这些情况会重复,考虑容斥掉相同的,大力讨论一下。
具体实现了一个 \(calc(x,op)\) 函数,表示对以 \(x\) 结尾的最后 \(4\) 位划分成一段,最后两位不变,倒数三四位交换的方案对 \(f_{op}\) 的贡献。如果 倒数三四位能够交换就直接返回,否则倒数第 \(6\) 位到倒数第 \(3\) 位必须能划分成一段,然后递归到 \(calc(x-2,op)\) 即可。
其余的细节省略,复杂度感觉是 \(\mathcal{O}(|s|^2)\),实际上跑起来 \(100ms\) 都不要。