ULR #1

两年了,我终于来补这场比赛的题了。

题出的好!难度适中,覆盖知识点广,题目又着切合实际的背景,解法比较自然。

给出题人点赞 !

多线程计算 \((\texttt{Easy} \ 3 / 4)\)

根据期望的线性性可以得到每个状态的期望持续时间都是 \(\frac{1}{nm + 1}\),我们也不必关心亮灯的顺序,所以我们只需要计算出节能态总数,然后将其除以 \((nm + 1)!\) 即可得到答案。

容斥可得选 \(k\) 个位置且恰好有 \(x\)\(y\) 列全部被覆盖的方案数为

\[\sum\limits_{i \ge x} \sum\limits_{j \ge y} (-1) ^ {i - x + j - y} \binom{n}{i} \binom{m}{j} \binom{i}{x} \binom{j}{y} \binom{(n - i)(m - j)}{k - mi - nj + ij} \]

发现最后的一个组合数只与 \(k, i, j\) 有关,更准确地说,是只与 \(k\)\(mi + nj - ij\) 有关。所以我们可以记 \(f_u\) 表示所有 \(mi + nj - ij = u\) 的系数和,那最终的方案数可以表示为

\[\sum\limits_{u} \sum\limits_{v} \binom{nm - u}{v} f_u F_{u + v} \]

这可以通过一次卷积完成计算。而 \(f\) 则可以通过二维 FFT 计算,具体地,二维 DFT 只需要把每一行和每一列都 DFT 一遍即可;IDFT 同理。

时间复杂度 \(\mathcal{O}(nm \log nm)\),我写的太屑了所以卡了一点常数。

光伏元件 \((\texttt{Medium} \ 4 / 3)\)

网络流。首先肯定是拆成 \(n + n\) 的二分图。

考虑 \(k = 0\) 时的问题。此时我们使用循环流限制第 \(i\) 行和第 \(i\) 列的 \(1\) 数量相等,具体地,连 \(i' \to i\)、流量为 \([dl_i, dr_i]\)、费用为 \(0\) 的边,再连一连其他的边跑最小费用上下界可行流即可。

对于 \(k \ne 0\) 的情况,我们需要给行和列一定的容错,即新建一些点用于处理多出来的 \(1\) 或者填补缺少的 \(1\)。考虑建立假源点 \(s'\) 和假汇点 \(t'\),并分别连 \(s' \to i, i' \to t'\)、流量为 \([0, k]\)、费用为 \(0\) 的边,同时把上面的 \(i' \to i\) 的边的流量范围改为 \([dl_i, dr_i - k]\) 即可。为了能够满足流量平衡,还需要连 \(t' \to s'\)、流量为 \([0, \infty)\)、费用为 \(0\) 的边。

事实上,有时候费用流 EK 确实比 Dinic 要快。

服务器调度 \((\texttt{Medium} \ 3 / 7)\)

我最不擅长写这种大码哥题了,基本上不可能在考场上写出来。。。。

对于一种颜色,显然我们只需要考虑其直径对于整棵树的贡献;而直径可以用线段树动态维护,所以我们只需要解决贡献计算的问题。

把距离拆成 \(d_u + d_v - 2d_{lca}\) 来计算。考虑直径 \((u, v)\) 的中点 \(w\),不妨设其为 \(u\) 的祖先。则 \(w\) 的子树内所有点与 \(v\) 的距离仅与其自身深度有关,这一部分子树加即可。子树外的部分的点和 \(u\)\(lca\) 可能不同,这时我们考虑 \(w \to 1\) 路径上的所有边的贡献。

如果是全局询问的话,一条直径对于路径上的边 \((x, fa_x)\) 的贡献次数就是 \(sz_x - sz_w\),我们做一个前缀和,把贡献加在 \(w\) 单点,用两个树状数组维护即可。

对于子树询问,多维护一些东西可以求出仅保留该子树的答案,然后我们把这棵子树看成一个点,考虑其到根的路径上每条边的贡献和,最后乘上子树大小即可。而这部分又可以通过树链剖分或全局平衡二叉树做到 \(\mathcal{O}(n \log^2 n)\)\(\mathcal{O}(n \log n)\)

如果使用 \(\mathcal{O}(1)\) 的 LCA 查询,则总的时间复杂度可以做到 \(\mathcal{O}(n \log n)\)但是我的常数太大了,还是卡了一段时间的常 /ll 看了一下题解做法,思路一样但是维护的部分好像比我简单很多?好牛啊。

打击复读 \((\texttt{Medium} \ 3 / 3)\)

脑抽了,但是比上一题好写多了。

首先对原字符串翻转,变为只修改 \(wr\),并记 \(wl\) 做前缀和的结果为 \(s\)。建出正串 SAM,答案即

\[\sum\limits_u \left( \sum\limits_{i \in \textbf{endpos}_u} wr_i \right) \left( \sum\limits_{i \in \textbf{endpos}_u} s_{i - l_u + 1} - s_{i - r_u} \right) \]

我们只需要求出第二项便可以把答案写为 \(\sum_i c_iwr_i\) 的形式,这样我们就可以 \(\mathcal{O}(1)\) 修改了。又注意到

\[\sum\limits_{i \in \textbf{endpos}_u} s_{i - r_u} = \sum\limits_v \sum\limits_{i \in \textbf{endpos}_v} s_{i - l_v + 1} \]

所以我们把问题转化为了求出第二项的前半部分,即 \(\sum_i s_{i - l_u + 1}\)。而这相当于这个等价类代表的最短串在字符串中出现的所有位置的左端点权值和。于是我们可以建出反串 SAM 再定位一下就可以解决问题。

时间复杂度 \(\mathcal{O}(n \log n + m)\)\(\mathcal{O}(n + m)\)。前者使用倍增解决定位,而后者则是把询问离线下来。

校验码 \((\texttt{Medium} \ 5 / 4)\)

带数论题,想不到。

首先我们把令 \(i = d_i^2 t_i, j = d_i^2 t_j\),其中 \(t_i, t_j\) 没有平方因子。我们所求即

\[ \begin{aligned} & \sum\limits_{t_i, t_j} \mu^2(t_i)\mu^2(t_j) \sum\limits_{d_i, d_j} t_i^c t_j^c (d_i, d_j)^c \\ = & \sum\limits_d d^c \sum\limits_s \mu(s) \sum\limits_{t_i, t_j} \mu^2(t_ids)\mu^2(t_jds) S_c\left( \sqrt{\frac{n}{dst_i}} \right) S_c\left( \sqrt{\frac{m}{dst_j}} \right) \\ = & \sum\limits_{r} f(r) g(\left\lfloor \frac{n}{r} \right\rfloor, r) g(\left\lfloor \frac{m}{r} \right\rfloor, r) \end{aligned} \]

其中 \(S_c(n) = \sum_{i = 1} ^ n i^c, f = \mu * id_c, g(n, d) = \sum_{i = 1} ^ n \mu^2(id) S_c(\sqrt{\frac{n}{i}})\)

\(f\) 是简单的,现在我们考虑发掘 \(g\) 的一些性质。

我们有

\[ \begin{aligned} g(n, d) & = \sum_{i = 1} ^ n \mu^2(id) S_c \left(\sqrt{\frac{n}{i}} \right) \\ & = \mu^2(d) \sum_{i = 1} ^ n \mu^2(i) [(i, d) = 1] S_c \left(\sqrt{\frac{n}{i}} \right) \\ & = \mu^2(d) \sum_{s \mid d} \mu(s) \sum_{i = 1} ^ {\left\lfloor \frac{n}{s} \right\rfloor} \mu^2(is) \left(\sqrt{\frac{n}{is}} \right) \\ & = \mu^2(d) \sum_{s \mid d} \mu(s) g(\left\lfloor \frac{n}{s} \right\rfloor, s) \end{aligned} \]

形成了一个递归的结构。而 \(d = 1\) 时考虑差分:

\[g(n, 1) = \sum_{i = 1} ^ n \mu^2(i) S_c \left(\sqrt{\frac{n}{i}} \right) \]

\[g(n - 1, 1) = \sum_{i = 1} ^ n \mu^2(i) S_c \left(\sqrt{\frac{n - 1}{i}} \right) \]

二者会产生差别当且仅当 \(i \mid n\)\(\frac{n}{i}\) 是完全平方数。我们可以枚举这样的 \((i, \frac{n}{i})\) 并求出差分数组,即可还原 \(g(n, 1)\)。预处理 \(n \le L\)\(g(n, 1)\),剩下的部分整除分块求的话,时间复杂度就是 \(\mathcal{O}(L + \frac{m}{L^{\frac23}})\),取 \(L = m^{\frac35}\) 可得时间复杂度为 \(\mathcal{O}(m^{\frac35})\)。顺带一提,使用整除分块时需要快速求 \(\mu^2(n)\) 的前缀和,可以利用 \(\sum_{i = 1} ^ n \mu^2(i) = \sum_{i = 1} ^ {\sqrt n} \mu(i) \left\lfloor \frac{n}{i^2} \right\rfloor\) 这个等式快速求出。

这个算法有粗略的上界 \(\mathcal{O}(2^{\omega(n)} (\sqrt m n^{\frac14} + n \log n))\),证明参见原题解。事实上,当 \(n = 4 \times 10^5, m = 1.6 \times 10^{11}\) 时,转移次数在 \(3 \times 10^7\) 左右;如果预处理 \(id \le n\)\(g(i, d)\),则转移次数只有 \(6 \times 10^6\) 左右,足以通过本题。

卫星基站建设

计算几何,考了就寄。

posted @ 2023-01-30 14:51  Scintilla06  阅读(131)  评论(0编辑  收藏  举报