跳转至

2021牛客暑期多校第六场

排名 当场过题数 至今过题数 总题数
37/1100 5 11 11

A

solved by Bazoka13

题意

给你一堆半平面以及半平面的移动方向,每秒半平面会向这个方向移动一个单位,q 组询问,每组询问时间 t 后半平面交的面积。n103,q105,t105

题解

我们会发现随着时间的增加,半平面中有的边就会被缩成一点,因此我们可以 O(n2logn) 预处理出来哪些时间节点半平面会被缩小一点。对于每个询问我们就可以 O(logn) 确定他此时的半平面的的形状。由于在这个时间里不会有缩点的情况,因此我们可以让每个边暴力向里缩一个矩形,再减掉与相邻边形成的四边形面积即可。

B

upsolved by JJLeo 2sozx

题意

给定一个图,每条边有个出现概率 Pi,j(t)=qi,j+(pi,jqi,j)a(t1)。其中 a 是定值,保证 pi,jqi,j0

F(i)t=i 时生成树个数的期望,求 i=1tF(i)

询问 [1,t] 时原图的生成树个数的期望和是多少。(1n3000mn(n1)21t108)

题解

考虑矩阵树定理,对于特定的 t,将每条边的概率作为权值,那么矩阵树定理求出的就是每种生成树出现的概率的和,也就是生成树个数的期望,因此得到了一个 O(tn3) 的做法。

考虑设 a(t1)=x,直接带着 x 求行列式,最终能得到一个多项式,再把 a(t1) 反带回来,可以发现每一项都是一个等比数列的形式,因此利用公式对 1t 求和即可。

对于新的行列式 (删掉最后一行最后一列的基尔霍夫矩阵),我们设其为 |xK+B|,由于 pi,jqi,j0,如果将 pi,jqi,j 作为每条边的边权那么生成树存在的概率必然不为 0,从而 |K|0,那么一定可以把 K 初等行变换到 I,我们对 B 做同样的变化,设行列式因为初等行变化的变化量为 C,则只需求 C|xI+A|,其中 AB 经过相同初等行变换得到的。

|xI+A| 和特征多项式类似,可以 O(n3) 将其化为上海森堡矩阵,再用 O(n3) 求出特征多项式,具体如下:

首先和 A 相似的矩阵特征多项式相同:

|xIP1AP|=|P1xPP1AP|=|P1(xIA)P|=|P1||xIA||P|=|P1||P||xIA|=|P1P||xIA|=|xIA|

因此我们考虑将 A 相似到一个方便求特征多项式的矩阵,上海森堡矩阵 B 的定义为:

  • 对于所有 ij+2Bi,j=0

我们先考虑如何将 A 为相似上海森堡矩阵:

因为是相似,所以每次初等行变换相当于右乘一个初等方阵,需要再左乘一个它的逆,三种初等方阵的逆方阵效果如下:

右乘 P 效果 左乘 P1 效果
交换第 i 行和第 j 交换第 j 列和第 i
i 行乘以 a i 列乘以 a1
i 行乘以 a 加到第 j 行上 j 列乘以 a 加到第 i 列上

对于第 i 列,我们用 Ai,i+1Ai,j (j>i+1) 全部消成 0,每进行一次初等行变换,立刻进行依次对应的初等列变换,注意我们每次都是操作第 i+1 行和第 j 行,因此初等列变换只会影响第 i+1 列和第 j 列,其中 j>i+1,因此不会影响到第 i 列。

这样我们就在 O(n3) 的时间内相似到了上海森堡矩阵 B,设 fi 是其 i 阶顺序主子式,其中 f1=B1,1,我们依次计算 f2,f3,,fn

对于 fi,按第 i 行展开,第 i 行只有两个数,如果选 Bi,i,那么剩下的即为 fi1,否则只能选 Bi,i1,那么第 i1 行也只剩两个数,如果选 Bi1,i,那么剩下的即为 fi2,否则继续递推,枚举第一个选 Bj,ij ,那么剩下的的即为 fj1,注意要乘上展开定理中的 1

其中只有对角线上有 x,其它都不带 x,因此递推的总复杂度为 O(n3)

最后,此题 corner case 不少,等比数列求和时注意公比是否为 1,并且 m=0 时按照题意的定义是没有生成树的。

C

upsolved by 2sozx

题意

n 个点的完全图,每次可以删除一个三元环,问怎么删能让剩余的边小于 n 条。3n2000

题解

删掉所有 i+j+k0modn,1i<j<kn

证明:

  • i+j+k=ni=1n3(n3i)12

  • i+j+k=2ni=12n3(2n3i)12k=n+12n3(2nk)12

  • 易证这两个条件下 (i,j,k) 一定不相等

D

upsolved by JJLeo 2sozx

题意

一个数开始为 0 ,每次随机选择一个 y[0,n],如果 xy>x ,则 x=xy ,否则 x 不变,当 x=n 时停止操作,问期望操作多少次。

n=2k1 ,每个数的概率通过题目给出,答案 mod109+7。(2n216)

题解

考虑一个推期望的式子

E(x)=(E(x)+1)S(x)+xy>x(E(xy)+1)py S(x)=ixpi 化简可以得到

E(x)=1+xy>xE(xy)py1S(x)

答案可以通过 cdq 分治计算,对于一层的计算,首先计算右半的答案,然后用 FWT 转移到左侧即可。

注意同一层中前缀相同,因此 FWT 的长度可以相应减少,从而复杂度是 O(nlog2n) 的。

E

upsolved by JJLeo 2sozx

题意

起始有一个树根,每次操作选择一个节点 u 生成一个颜色为 c 的叶子结点,或者询问节点 u 子树中颜色为 c 的节点个数,强制在线。c,q5×105

题解

通过 dfs 序转化成序列问题,只不过我们通过改变 dfs 顺序使得这个序列比较好维护。

具体来说,维护每个点子树 dfs 序中最后一个点的下一个点 end,以及其第一个儿子。 这样,每次新增把新点当作 u 的一个新儿子即可,每个点的 end 永远不变,新增时为其初始化为下一个点即可。

将每个点的值映射到 long long 值域内,使用替罪羊树维护每个点的权值,一旦不平衡就重构。

替罪羊树的重构不影响节点间的相对位置,因此我们只需要对每个颜色维护一个平衡树,每次加点的时候向对应颜色的平衡树加点即可,查询即为找到依靠 end 找到对应区间进行区间查询即可。

模板里 KDTree 重构没有中序遍历,因为本来就是乱搞,这里不是乱搞是正经的排序,要中序遍历。

F

solved by JJLeo 2sozx Bazoka13

题意

西内

题解

西内

G

solved by JJLeo 2sozx

题意

G(n) 是这样一张有向图,除了点 n 外每个点都有入度,且边 (i,j) 存在当且仅当 i=pj,其中 p 是质数。

G(12) 如下:

G

现在给定 n,求 G(1),G(2),,G(n) 的边数之和。(1n1010)

题解

i 出现在 G(n) 当且仅当 in,且点 i 的出度在任意 G(n) 都是相同的,因此我们可以在每条边的初始点来计算它,显然点 i 的出度为 w(i),即 i 的不同质因子个数,因此答案为: i=1nniw(i) 考虑如何计算 w(n),考虑每个质因子的贡献,即为: p is a primenp=i=1n[i is a prime]ni 我们用 min_25 筛算出 n 的整除分块点的质数个数和,也就是 i=1n[i is a prime],那么上式即可用数论分块来解决。这样对于 n 的每个整除分块点都需要再用一次整除分块,因此时间复杂度为 O(i=1nni)=O(n34),利用杜教筛均摊的技巧,我们可以线性筛预处理出前 O(n23)w(n),对剩下的用整除分块,这样复杂度就是 O(n23) 了。

另外,还要加上 min_25 筛第一部分的复杂度。

J

upsolved by JJLeo 2sozx

题意

一个无向连通图,如果联通块个数为奇数,则这个联通块 C 贡献为 iCai ,否则贡献为 iCai,可以任意删除边,问总体最大贡献是多少。n106,ai109,m106

题解

2sozx's solution

联通块大小为偶数的不用考虑。

联通块大小为奇数时,我们可以证明一定只删除一个点最优。考虑删除哪个点,如果点非割点,则可以任意删除,否则看这个割点链接的其余联通块是否全为偶数,如果全是偶数则可以删除,否则不可以删除,复杂度为 O(n)

判断割点其余联通块是否为偶数时可以在 tarjan 判断割点的时候直接进行判断。

JJLeo's solution

n 为偶数时不需要删边。

否则,对于任意一种方案,一定可以将其变为将其中奇数个点拆成孤立点,剩下连通块中的边不动。

可以证明最优方案只需要选择一个点将其变为孤立点:

考虑建出圆方树,将选择的孤立点拿出来建虚树,显然如果只选择一个叶子节点也是合法的,且其中一部分之前还删掉了一些点,而选择它们在一起组成一个偶数连通块,因此答案更优。

因此,我们建出圆方树,依次考虑每个点删掉后的答案即可。只需要考虑删掉这个点后剩下连通块都是偶数个点的那些点,当然就算全考虑答案也是对的,因为其它情况答案一定不优。

K

upsolved by JJLeo 2sozx

题意

一棵 n 个节点的树,m 次询问,问一条链不可以选择相邻的点的权值和最大是多少。n5×105,m107

题解

这个问题显然可以用线段树做,维护两端选 / 不选的最大值进行合并,链可以用然后用重链剖分解决,复杂度是 O(mlog2n) ,但是此题 m 过大,显然是要 O(1) 询问。

本题即为猫树在点分树上的拓展,求出每个点到点分树上每个祖先的 (不考虑祖先的) 两端选 / 不选的最大值,之后每次询问找到这两点在点分树上的 lca,显然这是它们路径上的一个点,用预处理出来的值 O(1) 合并即可。

求 lca 要用欧拉序 + ST 表来预处理。总复杂度为 O(nlogn+m)

记录

0h:开始看I,ZYF想了想直接秒了,看大家都过了F,CSK ZYF看F,MJX看H,想了半天F,不会做,CSK开始直接冲A的板子暴力,MJX喂ZYF H,ZYF直接开写扫描线开冲。CSK数组开小了,然后发现暴力确实会T(只能说几何常数起飞)。ZYF写完WA了,开始De

1h:ZYF和MJX观察ZYF代码,太tm对了,MJX开始写垃圾对拍,虽然对拍完全不对,但是找到了错误的数据(x)。CSK改了改常数继续冲A模板暴力。ZYF发现就最后输出的横纵坐标反了,其它完全正确,寄!

2h:自闭F,ZYF写了个完全假的F,然后开始和出题人对线

3h:前半小时继续对线,后半小时开始换题,考虑G,MJX和ZYF开始疯狂讨论,搞了个式子出来,不会优化。然后开始测暴力的复杂度(x。ZYF把复杂度写出来,发现就是没有优化的杜教筛的复杂度,想到直接前 n23 预处理复杂度就完全正确了,直接开冲。

4h:ZYF过了,然后发现F太傻逼了,CSK继续改A,ZYF先写F,直接过了。开始二分A的范围,冲冲冲!

总结

输出一定不要反

MJX对拍写的准点(x

Dirt

A(+10):开始给了两发暴力,常数大寄了,数组还开小了,然后二分的返回值错了,但是过了大多的样例,最后TLE因为二分次数太多了(罚的好啊,+100都行)

H(+1):经典x, y写反了

回到页面顶部