跳转至

"蔚来杯"2022牛客暑期多校训练营3

排名 当场过题数 至今过题数 总题数
53/1519 5 10 10

A

solved by JLK

题意

签到,略

题解

求前缀后缀LCA即可。

B

upsolved by TYB

题意

需要把\(n\)个人派遣到\(k\)个城市,每个城市需要的人数是固定的。把不同的人派遣到不同城市,代价都是不同的,求最小代价。

\(n\le10^5,k\le10\)

题解

一眼费用流,但肯定过不去,那就模拟费用流。

考虑每次费用流的路径,形如\(st\rightarrow a\rightarrow b\rightarrow ed\)(字母表示城市),其实就是一个人去了\(a\)城市,一个原来在\(a\)城市的人到了\(b\)城市。所以表示\(n\)个人的点没有必要建出来,只需要保留\(k\)个表示城市的点和源汇点。然后用\(k^2\)个堆维护城市间的边,每次把最小的一条边拿出来跑SPFA即可。

复杂度\(\mathcal{O}(nSPFA+nk^2\log)\),但两个都跑得不满,所以可以通过。

C

solved by JLK

题意

\(n\)个0-4组成的数字串,任意排列,求最小的结果数字串。

\(1 \le n \le 2\times 10^6,\sum |s_i| \le 2\times 10^7\)

题解

可以使用基于比较的贪心法,\(i\)串在答案中在\(j\)前面的条件是\(s_i+s_j \le s_j+s_i\)

据说用stable_sort就是\(O(\sum |s_i| \log n)\)的,不太懂。

考虑优化,其实可以在Trie上走,对于两个串\(a,b\),如果他们没有前缀关系,那么直接比较字典序,即Trie上的dfs序即可。如果它们是前缀关系,可以利用exkmp来求lcp然后判断大小关系,需要一定分类讨论。这样直接sort是\(O(n\log n+\sum |s_i|)\)

还有一个去掉log的做法。按dfs序插入串,插入的时候实时维护一个当前的顺序链表。每次插入相当于要考虑和所有前缀的大小关系(大小关系即为前后关系)。

设排在\(b\)前面的集合是\(A\),后面的集合是\(B\)。可以证明所有\(B\)中的元素在链表里是相邻的,且都排在末尾。即\(B\)的所有元素中间没有别的串。

证明:假设有一个别的串\(x\notin B\),和\(B_1\in B\),满足\(B_1 \lt x\)。如果\(x\)\(b\)的前缀,那么\(x\notin B\),则\(x \in A\)\(x \lt b\)。如果\(x\)不是\(b\)的前缀,由于我们是按字典序插入,显然有\(x \lt b\)。那么\(x \lt b\),而\(B_i \gt b\),和\(B_1 \lt x\)矛盾。

所以只需要\(O(|b|)\)比较出和所有前缀的大小关系,就可以知道\(B\)集合的所有元素,找一个最前的插入即可。总复杂度为\(O(n+\sum|s_i|)\)

D

upsolved by JLK

题意

\(n\)个点以\(1\)为根的树,一开始所有边都是双向,随机选\(K\)条边变成指向根的单向边。

给定起点\(s\),随机游走,求到达\(1\)的期望步数。

\(1\le n \le 10^6,0 \le K \le n-1\)

题解

一个重要结论:从一个点出发随机游走,走到父亲的期望步数为\(2\times siz-1\)\(siz\)为子树大小)。

所以在\(K=0\)的情况下,直接把\(s\)到根的路径上每条边的期望加起来即可。

对于\(K \gt 0\),把一些边变成单向边,就是父亲无法到达它的儿子了。对子树内所有点没有影响,而对于子树外的边,可以看做是子树里的点减少了,相当于没有这个子树,期望也会减少。

考虑计算一条单向边\(a\)对双向边\(b\)的贡献,那么\(b\)\(a,b\)之间的边都是双向的,只有\(a\)是单向的,其他边随意。单向边对期望的贡献是\(-2\times siz\)再乘上这种情况的概率,即\(\frac{C_{n-1-d}^{K-1}}{C_{n-1}^K}\)。(\(d\)为距离)

需要计算\(s\)到根路径上所有边被贡献的期望。发现上式概率只和距离有关,而每条边能够贡献的距离是一个区间,可以简单差分一下计算。也就是计算出每个距离的贡献之和,然后再根据距离来算概率,将答案减去期望。

\(O(n)\)

E

upsolved by JLK

题意

\(n\)个点等间距排成一个环,环上还有\(m\)个点连出去等长的弦,每个弦链接\(a_i\)\(a_i+L\)

现在要在环和弦上面放两根不相交的电线\(1\rightarrow n,2\rightarrow n-1\),电线必须沿着编号从小到大的方向走,可以在任何交点转弯。求方案数。

\(4 \le n \le 10^6,0 \le m \le 10^4,1 \le L \le \frac n2\)

题解

观察一下这个图,实际上由于规定了顺序,转移是一个DAG。

很明显可以应用LGV引理,设\(f(i,j)\)表示\(i\rightarrow j\)的方案,则答案转化为\(f(1,n)\times f(2,n-1)-f(1,n-1)\times f(2,n)\)

考虑怎么求出\(f\)。在DAG上,我们转移的时候实际上只关心拓扑序。这个图上的转移就是一个点转移到当前弦的下一个交点。

有一个性质,固定一个弦,另一个弦移动,那么相交的点和另一个弦的起始位置正相关。也就是说,另一个弦起始位置越大,它们的交点的拓扑序就越后面。

因此如果我们按照编号从小到大枚举弦来转移,那么前面的弦实际上只有目前的最后一个交点有用(dp只会转移到相邻交点)。

\(dp_i\)记录从起点到达从\(i\)点开始的弦的最后一个交点的方案数。

首先是每个点的起始方案,要么从环上直接转移,要么从\(i-L\)的弦转移过来。

然后考虑相交,从小到大枚举相交的所有弦来转移,这样枚举的时候实际上已经保证了转移的拓扑序。如果当前枚举到\(j\),那么目前\(i\)\(j\)的最后一个交点都可以转移到\(i,j\)的交点,也就是同时更新\(dp_i,dp_j\)\(dp_i+dp_j\)

\(1\)\(2\)分别开始做一遍dp即可得到答案。注意直接连\(1\rightarrow n\)的劣弧也是合法的,因为也是按编号从小到大的方向。

\(O(n+m^2)\)

F

solved by JLK

题意

\(n\)个点\(m\)条边的无向图,\(q\)次询问,每次询问对于\(x,y\),是否存在一个\(x\)\(y\)的包含\(n\)个点的路径(排列),使得任意前缀联通、任意后缀联通。

\(2 \le n \le 10^5,0 \le m \le 2\times 10^5,1 \le q \le 10^5\)

题解

结论是:按点双缩点(类似圆方树)之后,只有一个点双,或者点双构成一条链而且询问两点在两端且不是割点才是YES。

对于证明,首先考虑每个割点,必须度数为2且询问的两个点必须在其两侧。否则一定会出现一个点占据割点,另一个点占据割点另外一侧的点,而到达另一侧必须经过割点,所以这种情况是NO。

那么就是要对每个割点都满足这个条件,割点只能构成一条链。也就是点双构成一条链。

跑一遍Tarjan然后判断一下即可。

\(O(n+m+q)\)

G

upsolved by YZW

题意

板题。

题解

求凸包的 Minkowsky 和。

H

solved by TYB

题意

签到。

题解

略。

I

upsolved by Serval

题意

Given is two integers \(n, k\). Calculate the expected value of \(x^k\) modulo \(862118861\), where \(x\) is the number of fixed points of a random \(n\)-element permutation.

\(1\leq n\leq 10^{18}\), \(0\leq k\leq n + 5\times 10^3\)

题解

Let the random variable \(x\) be the number of fixed points of a random \(n\)-element permutation. By the definition, the expectation of \(x^k\) is $$ E(x^k) = {1\over n!} \sum_{i=0}^n {n\choose i} i^k\,!(n-i) = \sum_{i=0}^n {i^k\over i!(n-i)!}\,!(n-i) $$ where \(!n\) is the \(n\)-th derangement number, which is equal to $$ !n = n!\sum_{i=0}^n {(-1)^i\over i!} = n! [z^n] {e^{-z}\over 1-z} $$ Recall that the Stirling number of the second kind \({n\brace k}\) is the number of ways to partition a set of \(n\) elements into \(k\) non-empty subsets. Using the Stirling numbers of the second kind to expand \(i^k\) gives $$ \begin{aligned} E(x^k) &= \sum_{i=0}^n {1\over i!} \sum_{c=0}^{k} {k\brace c} i^{\underline{c}} [z^{n-i}] {e^{-z}\over 1-z} \\ &= \sum_{c=0}^k {k\brace c} \sum_{i=0}^n {1\over (i-c)!} [z^{n-i}] {e^{-z}\over 1-z} \\ &= \sum_{c=0}^k {k\brace c} \sum_{i=0}^n [z^i] (z^c e^z) [z^{n-i}] {e^{-z}\over 1-z} \\ &= \sum_{c=0}^k {k\brace c} [z^n] {z^c\over 1-z} \\ &= \sum_{c=0}^k {k\brace c} [c\leq n] \\ &= \sum_{c=0}^n {k\brace c} \end{aligned} $$ Recall that the Bell number \(B_n\) is the number of all the possible partitions of a set of \(n\) elements. When enumerating the number of subsets as \(k\), it is obvious that $$ B_n = \sum_{k=0}^n {n\brace k} $$ We only need to concentrate on speeding up the calculation of $$ E(x^k) = B_k - \sum_{i=n+1}^k {k\brace i} $$ Using the following identity called Touchard's congruence $$ B_{n+p} \equiv B_n + B_{n + 1} \pmod p $$ held for any prime \(p\), \(B_k\) can be calculated in \(\mathcal{O}(p^2\log k)\) time by calculating \(x^k \bmod (x^p-x-1)\).

For \({n\brace n-x}\) part, considering that \({n\brace n-x}\) is the number of ways to partition \(n\) elements into \(n-x\) non-empty subsets, obviously there are no less than \(n-2x\) subsets with exactly one element. Since \(x\leq 5\times 10^3\), it is possible to pre-calculate the number of ways to partition \(i\) elements into \(j\) subsets with no less than \(2\) elements, denoted by \(f_{i,j}\), for all \(i\leq 10^4\) and \(j\leq i/2\). For the \(i\)-th element, it can either be partitioned into a new subset with another element, or be inserted into an existed subset. Thus, \(f_{i,j}\) obey the recurrence relation $$ f_{i,j} = (i-1) f_{i-2,j-1} + j f_{i-1,j} $$ with initial conditions \(f_{0,0}=1\) and \(f_{i,0}=0\) for all \(i > 0\). Summing up the number of partitions that contains \(k\) subsets with no less than \(2\) elements over all possible \(k\) gives $$ {n\brace n-x} = \sum_{k=0}^x {n\choose x+k} f_{x+k,k} $$ The formula above allows us to calculate a single \({n\brace n-x}\) using Lucas's theorem in \(\mathcal{O}(x\log p)\) time with pre-calculation in \(\mathcal{O}(x^2)\) time. In this way, the problem can be solved in total \(\mathcal{O}(p^2\log k + (k-n)^2\log p)\) time.

This approach of calculating \({n\brace n-x}\) seems to be more straightforward than using the Eulerian numbers of the second order. Great thanks to Toxel!

J

solved by JLK

题意

签到,略

题解

BFS即可。

记录

🐍感冒摸了,基本是两个人在打。

JLK过A(0:12)。看到一车人过C,但是没什么想法。

TYB开始写H,JLK看其他题。

TYB过H(1:12)。

JLK写J,WA一次后AC(1:29)。

然后一起讨论F,JLK猜了个结论开始写,但没考虑清楚,WA两次后AC(3:06)。

TYB写C的二分哈希做法,发现很慢。JLK尝试卡常,交了一发TLE。

一起看D,没什么想法,TYB推了个式子但假了。

JLK交了一发C的暴力,居然过了(4:41)。

继续写D,最后还是没搞出来。

总结

JLK:点双和边双区别还是比较大的,可以看两个三元环交于一点的情况。

TYB:SAM感觉还不太熟练,多加练习;如果一个题过了一车但你不会,考虑一下直接交个暴力。

Dirt

C(-1)

F(-2):结论错了,应该看点双不是边双。还有一次是加了个corner case直接交了。

J(-1):转向判断有问题。