跳转至

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

排名 当场过题数 至今过题数 总题数
31/1456 7 10 13

A

solved by JLK

题意

有一个长度为\(n\)的数组\(a\),满足\(\sum \frac {1}{a_i} \le \frac {1}{2}\)。要求构造一个长度为\(m\)的数组\(c\),使得无限扩展\(c\)之后,每相邻\(a_i\)个数至少有一个\(i\)出现。

\(m\)自选。

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

题解

一种想法是按\(a_i\)从小到大,每\(a_i\)个数放一个\(i\),但是这样有些位置会产生冲突。考虑如何充分利用条件。

\(a_i'=2^{\lfloor \log _2 a_i\rfloor}\),有\(\frac {a_i}{2}\lt a_i' \le a_i\)。相当于要求更严格,满足新的\(a_i'\)即可。

\(\sum\frac{1}{a_i'} \le \sum\frac{2}{a_i} \le 1\)

\(\sum\frac{m}{a_i'} \le m\)

\(m\)是一个比较大的\(2\)的幂次即可,如\(2^{19}\)。然后就可以直接按\(a_i'\)填了。

这样为什么一定不会冲突?考虑一个\(a_i=2^k\)。如果他没有位置放了,说明前面至少有\(k\)\(2^k\)(小于\(2^k\)的数可以拆成若干个\(2^k\)),再加上这个数就超过限制了,所以不可能出现这种情况。

B

solved by JLK

题意

签到,略

题解

C

solved by TYB

题意

给出一个\(n\)个点\(m\)条带权边的无向图,求其所有生成子图最小生成森林的边权和。

\(n\le16,m\le100\)

题解

考虑每条边\((x,y)\)的贡献,显然只需要得知用边权比它小的边没有使\(x,y\)连通的方案数。

\(f_S\)表示只考虑两端点都在\(S\)内的边,且使\(S\)这个集合连通的方案数。那么只需要枚举一个包含\(x,y\)的集合\(S\),再统计出两端点都在\(S\)补集中的边的数量,即可计算该边的贡献。

考虑怎么求\(f\),显然可以枚举子集,这样是\(\mathcal{O}(m3^n)\)的;可以用子集卷积优化到\(\mathcal{O}(mn^22^n)\)

D

upsolved by TYB

题意

\([1,n]\)内有多少个数满足有偶数个质因子,且个数最多的质因子不超过总数的一半。

\(n\le10^{11}\)

题解

显然可以往min25筛的方向思考。

常规的min25筛,\(S(n,m)\)表示的是范围在\([1,n]\),且最小质因子\(\ge prime_m\)的数的答案。这题可以魔改一下,\(S(n,m,sum,mx)\)表示范围在\([1,n]\),最大质因子\(\ge prime_m\),且现在选了\(sum\)个数,个数最多为\(mx\)的答案。可以发现,我们只是额外记录了这两个信息,对复杂度没有影响。

E

upsolved by TYB

题意

给一个\(n\times n\)的矩阵\(a\),每次操作选择\((x,y,v)\),将第\(x\)行所有数\(+v\),第\(y\)列所有数\(-v\),在\(2n-2\)次操作内将矩阵所有数变为非负或判断无解。

\(n\le501\)

题解

先考虑一个必要条件:对于所有排列\(p\)\(\sum a_{i,p_i}\ge0\),因为操作不会改变这个值。

实际上这也是充分条件,下面给出一种构造。

首先KM找出最小的\(\sum a_{i,p_i}\),不妨设\(p_i=i\)

首先用\(n-1\)次操作使\(a_{i,i}=0,i\in[1,n)\),那么\(a_{n,n}\ge0\)

此时,不妨将第\(n\)行的数全部减去\(a_{n,n}\)(但不实际操作,即不会用掉操作次数),只要这种情况有解那么原来也一定有解。

如果我们只对\((i,i)\)操作,不妨设参数为\(v_i\),那么对于\((i,j),i\neq j\),需要满足\(a_{i,j}+v_i-v_j\ge0\),容易发现这是一个最短路的形式,只需要令\(v_i\)\(1\sim i\)的最短路即可。但看上去这一步需要\(n\)次操作,不符合要求。但我们发现,若\(v_i\ge0\),可以不对\((i,i)\)进行操作,实际上,\(v_1\ge 0\)一定成立,即不存在负环。可以证明,若存在负环,则\(\sum a_{i,i}\ge0\)不成立。故第二步只需要对\(i\in[2,n]\)操作,也是\(n-1\)步。

F

upsolved by JLK

题意

定义一棵以\(1\)为根的树\(T\)的哈希函数为\(F(T)=(\sum\limits_{i=1}^n\sum\limits_{j=i+1}^{n}X^iY^jZ^{lca(i,j)})\mod P,P=998244353\)

给定\(F(T),X,Y,Z\),构造一个至多为\(50\)个点的树,使得满足哈希值等于给定的\(F(T)\)

\(0 \le F(T) \lt P,2 \le X,Y,Z \le P-2\)

题解

一眼meet in the middle。可以让\(1\)只有两个儿子,确定好所有点归属哪棵子树,先枚举第一个儿子的子树形态,用第二个儿子的子树去撞。整棵树的哈希值可以分为,两个子树内的哈希值,两个子树之间的哈希值,和所有点到\(1\)的哈希值之和。

由于一开始确定好所有点归属哪棵子树,后面两个是确定的,只需要算两个子树内的哈希值。

但是枚举所有树的复杂度太大。

考虑随机。一开始随便把所有点分成两份,然后在两份里面不断随机连成两棵树。

第一棵树随机\(\sqrt P\)次存起来,第二棵树也随机\(\sqrt P\)次之后,就有挺大概率能撞上。

算子树内部哈希值的时候需要用到常数比较小的\(O(n^2)\)做法。一种方法是,只记录每个点的父亲,然后从小到大枚举点,每个点可以把贡献累加到所有祖先上,为了不算重复需要差分一下,即\(a\)\(b\)处的贡献为\(X^aZ^b-X^aZ^{father_b}\)。这样后面的点\(c\)可以直接枚举所有祖先,算出和前面的点的贡献\(\sum Y^csum_b\)

每个点先算自己作为大的点贡献,再把自己作为小的点的贡献加入所有祖先即可。

复杂度大概是\(O(\sqrt P n^2)\)

G

solved by YZW

题意

题解

H

**upsolved by **

题意

题解

I

solved by YZW

题意

题解

J

solved by YZW

题意

题解

K

**upsolved by **

题意

题解

L

**upsolved by **

题意

题解

M

solved by TYB

题意

签到。

题解

略。

记录

JLK过B(0:09)。

YZW过G(0:18)。

TYB过M(0:29)。

YZW过J(0:33)。

一起看A,没什么思路。JLK猜了个做法然后WA了。

TYB开始写C。

YZW搞出来一个A的正确做法,JLK改了一下过了(2:12)。

C TLE了,怀疑是复杂度不对,在想优化。

JLK尝试卡了卡常,然后过了(3:01)。

YZW写I,WA了几次,看不出哪里有问题。

TYB写D,WA了,后来才发现题意有问题。

最后乱试I,突然就过了(4:57)。

总结

JLK:数据范围小的题可以多想想随机化。感觉完全没往这方面想。

TYB:常数真是太重要了!

Dirt

A(-1)

C(-1)

I(-8)