跳转至

2021牛客暑期多校训练营9

排名 当场过题数 至今过题数 总题数
60/1238(校内2/19) 4 10 10

A

upsolved by TYB

题意

\(\sum_{i=0}^n\sum_{j=1}^{\lfloor\frac{ai+b}{c}\rfloor}i^pj^q\)

\(1\le n,c\le10^9,0\le a,b\le10^9,0\le p,q\le50\)

题解

我们知道类欧几里德算法可以求解形如\(\sum_{i=0}^ni^p\lfloor\frac{ai+b}{c}\rfloor^q\)的式子,详情见【LOJ138】类欧几里得算法_cz_xuyixuan的博客-CSDN博客

那么对于本题,只需要将后面的\(\sum_{j=1}^{\lfloor\frac{ai+b}{c}\rfloor}j^q\)拆成多项式,然后套用模板即可。

B

upsolved by JLK

题意

给定一个\(n\)个点\(m\)条边的图。定义一个子图\(S\)是k-degree的,当且仅当所有点度数都大于等于\(k\),并且\(S\)是联通的,并且\(S\)是最大的。(即,\(S\)除了自己的的任何一个子图都不是k-degree的)

再给出\(M,N,B\)三个参数。\(m(S)\)表示\(S\)里的边数,\(n(S)\)表示\(S\)里的点数,\(b(S)\)表示\(S\)里的点连到\(S\)外的点的边数。求出所有k-degree的子图中\(M\times m(S)-N\times n(S)+B \times b(S)\)​的最大值。(\(k \gt 0\)

\(1 \le n,m \le 10^6,-10^9 \le M,N,B \le 10^9\)

题解

首先考虑如何确定一个k-degree的子图。不难发现,一个(k+1)-degree的子图一定被包括在一个k-degree的子图里。也就是\(k\)从大到小,k-degree子图的范围是越来越大的。那么就要处理出一个点最早成为k-degree子图的一部分的\(k\)

首先每个连通块都是1-degree子图。对于一个k-degree子图,如果删去所有度数为\(k\)的点(删去旁边的一个点后变得小于\(k\)了也算),就是(k+1)-degree。

这样扫一遍可以得到每个点的最早的\(k\),设其为\(rk_i\)


接下来需要计算答案。

删点不便于计算,考虑加点,即按\(rk_i\)​从大到小加入。计算加入每个点的贡献。

设点\(x\)通过一条边到达的点里\(rk\)比它小的为\(E(\lt)\),等于大于同理​

一个点对\(n(S)\)的贡献就是1,对\(m(S)\)的贡献是\(E(\gt)+\frac{E(=)}2\)(如果同\(rk\)的两个点连边,当做各贡献一半),对\(b(S)\)的贡献是\(E(\lt)-E(\gt)\)(加入新的边界边,删去老的边界边)。

再用并查集维护一下联通信息即可。每次遍历边的时候,把已经是k-degree的连通块并到当前点里,然后把连通块的答案也累加过来。

由于还需要保证\(S\)是最大的,那么对于每个\(k\),加入所有点之后,扫一遍k-degree的所有连通块,把连通块的答案和最终答案比较。

排序可以使用基数排序,或者直接用vector之类的,做到线性。

\(O(n\alpha(n)+m)\)

C

upsolved by JLK

题意

二维平面的\(y\)轴上有\(n\)个点,对于每个\(i\),每次只能往右或者往下,要从\((0,a_i)\)走到\((i,0)\)且所有路径不能相交,求方案数。

\(1 \le n \le 5\times 10^5,0 \le a_i \le 10^6,a_i \le a_{i+1}\)

题解

由LGV引理,答案为

\[\begin{vmatrix} C_{a_1+1}^1 & C_{a_1+2}^2 & \cdots & C_{a_1+n}^n \\ C_{a_2+1}^1 & C_{a_2+2}^2 & \cdots & C_{a_2+n}^n \\ \vdots & \vdots & \ddots & \vdots \\ C_{a_n+1}^1 & C_{a_n+2}^2 & \cdots & C_{a_n+n}^n \\ \end{vmatrix}\]

每列提出阶乘,经过初等变换,可以得到

\[\left| \begin{array}{cccc} a_1+1 & (a_1+1)^2 & \cdots & (a_1+n)^n \\ a_2+1 & (a_2+2)^2 & \cdots & (a_2+n)^n \\ \vdots & \vdots & \ddots & \vdots \\ a_n+1 & (a_n+2)^2 & \cdots & (a_n+n)^n \\ \end{array} \right|\]

再每行提出\(a_i+1\),就是范德蒙行列式的转置形式。

那么\(Ans=\prod\limits_{i=1}^n\frac{1}{i!}\times \prod\limits_{i=1}^n(a_i+1)\times \prod\limits_{1 \le j \lt i \le n}(a_i-a_j)\)

只需要算出最后一部分即可。这可以使用FFT,分别将\(a_i\)​和\(-a_i\)​设置为下标,卷积后取大于零的部分,卷积后的\(c_i\)​即为\(i\)​这个数的指数,再用快速幂计算即可。

\(O(a_n\log a_n)\)

D

**upsolved by **

题意

题解

E

solved by JLK

题意

有一棵以1为根的树,每个点有权值,从根开始,越远权值越小。\(q\)次询问,每次询问从\(x\)点开始,经过权值在\([L,R]\)的点,总共可以到达多少个点。

\(1 \le n \le 10^5\)

题解

由于保证了深度越小权值越大,那么找到最浅的满足条件的点后,就相当于是在子树里找所有\([L,R]\)的点,这些点肯定都能到达。

找这个点可以通过倍增。离线之后按dfs序建主席树即可查询。

\(O((n+q)\log n)\)

赛时为了方便是用的DSU on tree+BIT,也并不太慢。

F

upsolved by JLK

题意

买或卖股票,总共有240分钟,每分钟可以进行交易。第\(i\)​​​分钟成交价格为一股\(p_i\)​​​,最多成交\(v_i\)​​​股。每次交易股数一定要是100的倍数,而且每次交易要付交易额\(0.03\%\)​的手续费(不足5元的当做5元,四舍五入到分)。求买/卖\(a\)​​股后最大的钱变化量。(开始为0,可以为负)保留两位小数。

\(100 \le a \le 5\times 10^6,0 \le v_i \le 5\times 10^5,0.01 \le p_i \le 3550\)

题解

可以把数量除100,把一股的价格乘100,再在整个过程中乘100,最后除100,过程中避免小数。(注意乘100的时候需要round)

首先列出递推式,以买入为例:

\(dp_{i,j}\)表示前\(i\)分钟,买了\(j\)​股的最大钱变化量。

\(dp_{i,j}=\max\limits_{j-v_i \le k \lt j}\{dp_{i-1,k}-100(j-k)p_i-\max\{\left[ \frac{3}{100}(j-k)p_i\right] ,500\}\}\)

(也可以这一分钟完全不买)

难点在于不足5元的情况。将上面的max拆掉,再将取整拆掉,可以得到

\(dp_{i,j}=\max \begin{equation} \left\{ \begin{array}{lr} dp_{i-1,k}-100jp_i+100kp_i-500, & 3(j-k)p_i \le 50000 \\ dp_{i-1,k}-100.03jp_i+100.03kp_i, & 3(j-k)p_i \gt 50000 \end{array} \right. \end{equation}\)

由于最大购买量和不足5元的限制,dp被分成两个区间,分别是这两种转移。可以用两个单调队列来维护(因为转移时\(j,k\)不会互相影响)。求出两种转移最优的\(k\)然后取max即可。

需要注意的是,单调队列里判断的时候可以直接用上式判断,即不取整。最后算的时候取整。因为只有这个取整部分会出现小数,其他都是整数,所以去掉取整符号对决策点的选择没有影响。

\(O(240\times \frac a{100})\)

G

solved by TYB

题意

一颗\(n\)个结点的以\(1\)为根的树,每个结点上有一个小球,每个小球会同时向父亲结点移动。每个结点都有\(p\)的概率成为吸收点,特别地,\(1\)号结点一定为吸收点,小球到了吸收点后会马上消失。若两个小球同时到达某个结点,不论该结点是否为吸收点,则视为发生碰撞,整个过程马上结束,获得的分数为\(0\)。若不发生碰撞,获得的分数为\(\sum_{i=1}^nf_i\)\(f_i\)为初始在\(i\)结点的小球在到达吸收点前经过的边数。求期望分数。

\(n\le5\times10^5\)

题解

首先注意到一个性质,每个结点最多有一个儿子不是吸收点,否则一定会发生碰撞。考虑如何计算贡献,我的方法是枚举每个结点作为吸收点,计算被这个点吸收掉的所有小球的贡献。为方便起见,以下称吸收点为黑点,非吸收点为白点。树形DP,\(g[x]\)表示从\(x\)开始的一条白点的链的期望长度,\(f[x]\)表示从\(x\)​开始的一条白点的链的期望贡献。注意\(f\)是一个二次的东西,要配合\(g\)进行转移。最后计算答案的时候,因为我们DP的时候仅考虑了那条链,所以还要乘上除了这条链外其它结点上都不会发生碰撞的概率。细节较多,实现时要头脑清晰。

H

solved by TYB

题意

定义仅由\(2,3,6\)组成的数为happy numbers,求出第\(n\)个happy number。

\(n\le10^9\)

题解

求出位数后逐位确定即可。

I

solved by JLK

题意

晦涩难懂,略

题解

十分简单,略

J

**upsolved by **

题意

题解

记录

开局签H(0:21)。JLK写E(0:39)。

然后想了ACJ,都没有什么想法。

JLK看了F巨长题面之后,以为是水题,交了一发WA(1:29)。然后发现题目中有个限制,想不出来,于是扔了。

TYB写G,中间调试多花了一点时间,一发AC(2:56)。

觉得A是个推式子题,扔了,继续想CJ。JLK想到了C以前做过类似的题是用行列式,但是没有想下去。J想过用带花树、模拟退火,最后YZW尝试用线性规划。

YZW对着板子尝试,WA1(4:00)。

JLK和TYB尝试理解I的题意。在发了clar之后推出了式子,但是式子没推完全,没有考虑分母为0的情况,WA了4发后AC(4:32)。

之后YZW还在尝试J,没有成功。

总结

JLK:可能对板子确实不太熟悉。J这种题应该多观察一下图的性质。

Dirt

I(-4)