20251117~20251123NOIP模拟赛

20251117NOIP模拟赛

A:

题目大意:

\(n\) 个点,每个点有 \(a_{i}\) 个孔,你现在要在这 \(n\) 个点中连 \(n - 1\) 条边,使得他们联通。
每条边连接两个孔,每个孔最多连接 \(1\) 条边,两种连接方案相同,当且仅当每条边连接的两个空不同。
问不同的方案数,模数给定。
\(n \le 10^6, a_{i} \le 10^9\)

解题思路:

看到生成树计数,往 prufer 序列上想。
但这个题对于第 \(i\) 个点来说,如果它的度数为 \(d_{i}\),那么内部的方案有 \(\frac{a_{i}!}{(a_{i} - d_{i})!}\)
那么对于一个度数为 \(d_{i}\) 的节点 \(i\),它在 prufer 序列中出现了 \(d_{i} - 1\) 次,对于 prufer 的方案数相当于 \(\binom{n - 2}{d_{1} - 1,d_{2}-1 \dots d_{n} - 1}\)
那么我们现在就有了式子:

\[\sum_{\sum_{d_{i} - 1} = n - 2,d_{i} > 0} \prod_{i = 1}^{n} \frac{a_{i}!}{(a_{i} - d_{i})!} \binom{n - 2}{d_{1} - 1,d_{2}-1 \dots d_{n} - 1} \]

先将后面的组合数拆开:

\[\sum_{\sum_{d_{i} - 1} = n - 2,d_{i} > 0} \prod_{i = 1}^{n} \frac{a_{i}!}{(a_{i} - d_{i})! \times (d_{i} - 1)!} \times (n - 2)! \]

然后我们发现中间的数和标准的组合数有 \(O(1)\) 的偏差,所以考虑变一下,变成一个组合数。

\[\sum_{\sum_{d_{i} - 1} = n - 2,d_{i} > 0} \prod_{i = 1}^{n} a_{i} \frac{(a_{i} - 1)!}{(a_{i} - d_{i})! \times (d_{i} - 1)!} \times (n - 2)! \]

\[\sum_{\sum_{d_{i} - 1} = n - 2,d_{i} > 0} \prod_{i = 1}^{n} a_{i} \binom{a_{i} - 1}{d_{i} - 1} \times (n - 2)! \]

因为我们知道了 \(d_{i} - 1\) 之和 为 \(n - 2\),然后我们后面的式子还是连乘的形式,所以考虑范德蒙德卷积的扩展形式。

\[\sum_{\sum_{d_{i} - 1} = n - 2,d_{i} > 0} \prod_{i = 1}^{n} a_{i} \binom{\sum_{i = 1}^{n} a_{i} - n}{n - 2} \times (n - 2)! \]

\[\sum_{\sum_{d_{i} - 1} = n - 2,d_{i} > 0} \prod_{i = 1}^{n} a_{i} \frac{(\sum_{i = 1}^{n} a_{i} - n)!}{(n - 2)! \times (\sum_{i = 1}^{n} a_{i} - n - n + 2)!} \times (n - 2)! \]

\[\sum_{\sum_{d_{i} - 1} = n - 2,d_{i} > 0} \prod_{i = 1}^{n} a_{i} \frac{(\sum_{i = 1}^{n} a_{i} - n)!}{(\sum_{i = 1}^{n} a_{i} - n - n + 2)!} \]

那么这个式子就能 \(O(n)\) 算了。

没想到的点:

  1. 不熟悉 prufer 序列,不知道 prufer 的原理,对生成树计数不敏感。
  2. 不熟悉范德蒙德卷积,稍微扩展一下就不会了,看到和固定,求组合数乘积也要敏感。

T3:

题目大意:

有两天,第一天有 \(n\) 个人,第 \(i\) 个人在 \(s_{i}\) 时刻进入同一个房间,在 \(t_{i}\) 时刻离开,如果两个人在同时在房间里,那么他们会互相加对方的好友。
第二天每个人会把自己的明信片挂到网站上,每个人可以看到/转发 好友自己发的/转发的明信片,问每两个人都看到对方的明信片最小的转发次数。
\(n \le 2 \times 10^5\)

解题思路:

这种题,它并不特别关心标号,所以我们可以先排序,所以我们先按 \(l\) 从小到大排序。
由于注意到人与人之间的明信片互不影响,所以将每个人单独考虑,即让其他人都看到这个人明信片的最小转发次数。

而对于第 \(i\) 个人来说,\(1 \sim i - 1\) 不会被 \(i + 1 \sim n\) 影响,所以我们可以直接设 \(f_{i}\) 表示前 \(i\) 个,由 \(i\) 转发,最少需要多少个转发。
转移就是枚举上一个转发得位置,BIT 优化。
那么设 \(g_{i}\) 表示 \(i\) 转发,让 \(i \sim n\) 都收到最少多少转发。
同理,也是 BIT。

但我们发现,\(1 \sim i - 1\) 中可能会出现一个超级长的,这样他就影响到 \(i + 1 \sim n\) 这部分了。
然而,能影响到后面的线段显然只有一个,那就是前面转发的人中 \(r\) 最大的。
那么考虑它要满足什么条件,以及对答案的贡献是什么。

条件显然易见,要求完全覆盖 i,贡献就是 \(f_{j}+g_{j}-1\),二维数点即可。
但是注意一个地方,我们之前在排序的时候,只要求了 \(l\),但这里我们为了好写,当 \(l\) 相同的时候,要按 \(r\) 从大到小。
\(O(n \log n)\)

20251118NOIP模拟赛

D:

题目大意:

给定一棵 \(n\) 个点的树,第 \(i\) 条边连接 \(x,y\),权值为 \(n^w\)
\(dis_{u,v}\) 的第 \(k\) 小值。
\(n \le 5 \times 10^4\)

解题思路:

考虑由于只有 \(n-1\) 条边,所以不会发生进位。
那么维护的时候拿主席树加哈希即可做到 \(O(log)\) 比较。

但是第 \(k\) 大这个限制是不好做的。
那么考虑二分,但是值域巨大,就连二分都是 \(O(n)\) 量级的。
不过注意到关键点只有 \(O(n^2)\) 个,那么可以通过类似快速排序的做法给他进行一个随机二分。

这样期望能在 \(O(\log(n^2))\) 的时间复杂度内得到答案。
至于check的时候,我们利用边分治/点分治的结构,以边分治为例,我们先将边左右两个子树按权值从小到大排序,那么对于每层的每个节点,维护它在当前排名内对应的对面的区间。
那么确定一个路径之后,我们就通过双指针来 \(O(n \log^3 n)\) 的时间复杂度内解决这个事情,有个实现细节,就是由于这个题开了 \(\test{1}{G}\),主席树可以开 \(\log\) 层,这样会好写一点。

边分治和点分治都是用来解决路径问题的,但边分治有着天然的优势,那就是不需要容斥,劣势也很明显,就是需要三度化,自带一个大常数。
但是他们都有一个共同点,那就是将一棵树拆成了没有交集的链的合并。

20251121 NOIP模拟赛

写可持久化数据结构的时候记得对于上一个版本的保存。

20251122 NOIP模拟赛

C:

题目大意:

有两个数组 \(a,b\),长度分别为 \(n,m\),其中 \(1 \le a_{i},b_{i} \le m\)
每次你能进行一个操作,选出一个集合 \(S\),让所有在 \(S\) 内的点 \(i, b_{a_{i}} -> a_{i}\)
问多少步之后满足 \(a\) 不减。
\(n,m \le 10^6\)

解题思路:

发现就是让最大步数最小,考虑二分答案。
每一步就相当于在这个 \(b\) 的基环树上跳,那么我们从前往后扫的时候可以拿主席树维护一下,时间复杂度 \(O(n \log^2 n)\)

为啥要用主席树啊
我直接用指针扫不是均摊 \(O(1)\) 的吗。
这样不就 \(O(n \log n)\) 了吗???

下次先不着急用数据结构,想想能不能利用什么性质。

20251123NOIP模拟赛

以后不会优化的 dp 可以通过枚举一些里面可以直接枚举的维度来做。

posted @ 2025-11-21 23:09  positive_deviation  阅读(11)  评论(0)    收藏  举报