2023NOIP A层联测 6

万花筒

对于由原图中一条边产生的若干条边,我们设原图边为 \((u,v)\),设 \(d=\left\lvert u - v \right\rvert\)

那么我们先考虑 \(u\) 连向 \((u + d) \bmod n + 1\),从 \((u + d) \bmod n + 1\) 连向 \((u + 2d) \bmod n + 1\),以此类推。

这样显然最终会连回 \(u\),形成一个拥有 \(\dfrac{\operatorname{lcm}(d,n)}{d}\) 条边的环。

对于这样一个 \(d\),能够把 \(n\) 个点连成若干个环,环的个数为 \(\gcd(d,n)\)

考虑如何构建最小生成树,肯定是优先使用边权较小的边,从小到大依次处理。

首先我们假设 \(n\) 个点是相互孤立的,对于当前的 \(d\),有 \(\gcd(d,n)\) 个连通块。

下面是 \(n=6,d=2\) 的情况:

对于每个连通块,我们考虑将其缩成一个点,那么每个连通块需要至少 \(\dfrac{\operatorname{lcm}(d,n)}{d} - 1\) 条边,总共 \(\gcd(d,n)\) 个连通块,所以贡献为

\[(\dfrac{\operatorname{lcm}(d,n)}{d} - 1) \times \gcd(d,n)=n - \gcd(d,n) \]

也就是说,对于孤立的 \(n\) 个点,可以最少用 \(n-\gcd(d,n)\) 条边将这 \(n\) 个点缩为 \(\gcd(d,n)\) 个点。

按照这样的方式继续操作,直到只剩下 \(1\) 个点,此时获得了最小生成树。

冒泡排序趟数期望

首先考虑定义 \(inv_i\) 为第 \(i\) 个数前面比他大的数的个数,显然可以得知 \(res = \max \left\{ inv_i \right\},i \in \left[ 1,n \right]\)

因为冒泡排序每次会将一个前面最大的值放在后面,那么对于一个位置 \(i\) 来说,需要 \(inv_i\) 轮操作就可以使得 \(i\) 的位置合法。

那么对于整个序列的答案便是所有 \(inv_i\) 的最大值。

那么问题可以转化为求 \(\max \left\{ inv_i \right\}=k\) 的方案数。

考虑第 \(i\) 个位置可以放哪些数,我们首先满足 \(\max \left\{ inv_i \right\} \leq k\) 的情况。

\(n\)\(1\) 倒着枚举填每一个位置。

对于 \(i > k\),那么要从 \(k + 1\) 个最大的未被选的数中选出 \(1\) 个。因为没有被选中的数会出现在它前面,会对 \(inv_i\) 产生贡献,所以这样就有不会超过 \(k\) 个比所选数大的数出现在它前面。

这样的方案数是 \((k+1)^{n-k}\)

对于 \(i \leq k\),可以随便取,因为无论怎样都不会使得 \(inv_i\) 超过 \(k\) 对答案造成影响,所以方案数是 \(k!\)

我们要求的是 \(\max \left\{ inv_i \right\}=k\) 的方案数,所以还要去掉 \(\max \left\{ inv_i \right\}<k\) 的情况。

\(\max \left\{ inv_i \right\}<k\) 实际上可以转化为 \(\max \left\{ inv_i \right\} \leq k - 1\),那么与上面统计方案数类似,就是 \(k^{n-k}\)

所以 \(\max \left\{ inv_i \right\}=k\) 的方案数为 \(k!((k+1)^{n-k} - k ^{n-k})\)

枚举不同的 \(k\),统计方案数再乘上 \(n!\) 的逆元。

数点

\(k \leq 3\),分三部分考虑。

\(k = 1\) 时,考虑直接把矩形包含的点数转化为一个点被多少矩形包含,平凡的,答案为

\[\sum^{n}_{i=1}i\times p_i \times(n-i+1)\times (n-p_i+1) \]

\(k=2\) 时,我们知道 \(x^2 = 2\dbinom{x}{2}+x\),所以我们还是可以求包含两个点的矩形个数。

这样我们要考虑两个点的贡献(两个点同时在多少个矩形内),我们设两个点 \(i < j,p_i < p_j\),他们的贡献是 \((i,p_i)\) 左下方部分和 \((j,p_j)\) 右上方部分的乘积。

之前做树状数组的时候做过一道题叫数星星,可以统计一个点左下方点的数量,这里用到了类似的方法。

我们逐个枚举,枚举到这个点时有两方面操作,一是统计这个点与之前点的答案,二是记录下这个点左下方部分矩形的大小。

树状数组维护的是已经枚举过的点左下方矩形的面积和,这样枚举到一个新点时就可以用新枚举到点右上方矩形面积乘上之前统计的面积和就得到了这个点与之前枚举点组合的答案。

\(k=3\) 时,我们知道 \(x^3 = 6\dbinom{x}{3} + 6\dbinom{x}{2} + x\)。只有 \(\dbinom{x}{3}\) 是未考虑过的,有以下几种情况:

$##   ##$   #$#   ##$   #$#   $##
#$#   #$#   $##   $##   ##$   ##$
##$   $##   ##$   #$#   $##   #$#

前两种实质上与两个结点的贡献相同,树状数组即可。

后四种本质是相同的,线段树维护。

精甚细腻

咕了(国内玩这梗着实有点危险)

posted @ 2023-10-07 19:11  -白简-  阅读(28)  评论(0编辑  收藏  举报