Public NOIP Round #7

A

答案为 \(\sum\limits_{k \ge 0} \sum\limits_{i = 1}^n \sum\limits_{j = 1}^n [a_i + b_j \ge 10^k]\)。先把 \(a, b\) 排序,枚举 \(k\) 后双指针统计答案即可。时间复杂度 \(O(n (\log n + \log V))\)

B

\(|a_i - a_j| = k\) 就在它们之间连一条无向边。因为保证序列没有相同元素所以图是若干条链。

容斥,相当于断开若干条边,然后把剩下的链拼接在一起,其中长度 \(\ge 2\) 的链要乘一个 \(2\) 的系数(顺序正着或者反着均可)。预处理出长度为 \(i\) 的链断成 \(j\) 条链的贡献系数,最后直接 DP 即可。

时间复杂度 \(O(n^2)\)

C

考虑固定了 \(w, b\) 如何算 \(f(w, b)\)。不失一般性假设 \(w \ge b\)

\(S\) 为必须是白色的点(其所有子树大小均 \(< w\)),分类讨论。

  • \(S \ne \varnothing\),把 \(S\) 中的点删除后黑点只能在其中一棵子树内,\(f(w, b)\) 为大小 \(\ge b\) 的子树个数。
  • \(S = \varnothing\)\(f(w, b)\) 只能为 \(1\)\(2\)\(f(w, b) = 1\) 当且仅当存在一个点,它有两棵子树 \(\ge w\),另外还有一棵子树 \(\ge b\)。感性理解一下,若这个条件不满足那么黑色连通块相当于被白色连通块堵住了,要么在它前面要么在它后面,不可能跨过它,所以等价类数量为 \(2\)

得到这个结论后计算答案是简单的。仍然分两类讨论。

  • \(S \ne \varnothing\),从大到小枚举 \(w\),并查集维护删除 \(S\) 后各个连通块的大小。线段树维护 \(\sum\limits b \times f(w, b)\) 即可。
  • \(S = \varnothing\),我们预处理出每个点前三大的子树大小,然后算出第二大子树大小 \(\ge w\) 时第三大子树大小的最大值 \(t\)。那么 \(b \in [1, \min(t, w)]\)\(f(w, b) = 1\)\(b \in [\min(t, w) + 1, w]\)\(f(w, b) = 2\)

这样只计算了 \(\sum\limits_{w = 1}^{n - 1} \sum\limits_{b = 1}^{\min(w, n - w)} w \times b \times f(w, b)\),把答案乘 \(2\),最后减去 \(\sum\limits_{i = 1}^n i^2 f(i, i)\) 即可。

时间复杂度 \(O(n \log n)\)

D

考虑 \(a_i \le 10\) 的部分分。

拆贡献,转 \(01\),枚举一个 \(p\),令 \(b'_i = [b_i \ge p]\),把所有 \(p\) 的情况的 \(1\) 的个数求和即可。

差分,转化为计算 \(\sum\limits_{i = 1}^x a_i\)

发现只有 \(01\) 的冒泡排序过程是非常好看的,大致形如每个 \(0\) 每轮都会往前移一格。所以我们不妨统计 \(0\) 的个数和。发现这个就是 \([l, \min(l + x + k - 1, r)]\)\(0\) 的个数对 \(x\)\(\min\)

这个是很好用主席树算的。大概就是求出区间中第 \(r - l + 2 - x\) 大的数,设其为 \(t\),那么 \(p \le t\) 时贡献为区间 \(0\) 的个数(这个等于 \(\sum\limits_{i = l}^r \max(t - a_i, 0)\),可以主席树计算),\(p > t\) 时贡献为区间长度。

时间复杂度 \(O(n \log n)\)

posted @ 2024-10-23 11:54  zltzlt  阅读(60)  评论(0编辑  收藏  举报