25牛客暑假集训营

牛客暑期集训营1 L
题意:对一个给定的数组有\(q\)次单点修改,逐一输出在每次修改之后前\(n/2\)的数的数量。
题解:

力大砖飞,用包含初始编号和对应值的小顶堆维护最大的前\(k/2\)个元素及其值,因为每次单点修改后,只有最后一位数会对整个数组产生影响。

感谢暨南大学某队的代码(码风相似的感觉看着太爽了)

Submission

牛客暑期集训营1 K
题意:由\(n\)个房间和双向走廊形成,已经对双向边中每一个单向边单独编号,在参观房间时,游客所走的编号数一定是递增的(如果为最大值则重新返回为1),求游客从每个房间参观时,所能经过房间的最大值。
题解:

需要注意的是,在转移进新房间时,下一步转移是"新房间->老房间"的编号为依据,而并不是在老房间的"老房间->新房间"编号为依据。

\(edge[mxn][4]\)存图,\(edge[i][0]\)表示节点邻居数量,\(edge[i][k]\)表示节点\(i\)\(k\)个门所连接的邻居。\(vis[mxn][5]\)为标记数组,\(vis[i][j]\)表示从第\(i\)个节点出发的第\(j\)个门已被访问。\(ans[i][j]\)表示从第\(i\)个节点的第\(j\)个门出发的环长度。

对图进行\(dfs\),终止条件在\(ans[room][door]\)已经有值或者\(vis[room][door]\)\(true\),此时需要注意:如果按照题目规则,\(dfs\)的下一个点已经被访问过,那么在下一个点的状态计算路径的时候实际上是被计算了两次,那么这一次是需要被减去的。其余就按正常\(dfs\)步骤复用即可。

感谢湖州师范学院某队提交的代码,码风很干净易懂。

Submission

牛客暑期集训营1 H
题意:对一个二进制字符串回答\(q\)个查询,第一种查询类型为翻转\([l, r]\)中的二进制位,第二种要判断在\(l, a, b\)给定的情况下,有多少个\([u, v]\)满足\(S_{a+x-1} = S_{b+x-1}\)对每个\(x\)属于\([u, v]\)都成立。其中保证第二类查询数量不超过2500。
题解:

第一类查询较为简单,只需要在翻转区间头尾打上标记即可。

第二类查询的关键在于把求"区间个数"转移为求每个长区间的"最大区间长度",手玩一下样例发现确定最大区间长度之后,包含其中的小区间总个数可以通过等差数列求和快速求解。

\(upd\):第二个修改的意思是,在一段长度为\(l\)的子段中,从\(a\)开始和从\(b\)开始,找相等的极长字段(也就是指,找其中相等的部分,每一个相等的部分取最长的一段),设长度为\(len\),则每段贡献有\((len+1)*len/2\)。将操作1利用差分标记降低复杂度后,总复杂度变为\(O(q_{1}+nq_{2})\),仍然需要降低。

那么我们想到分块,设分块长度为\(B\),利用一个\(A\)数组存储每个块的二进制值,块首字符对应的是位0。对于第一类查询,可以分为几种情况:1.修改只在一个块内 2.修改在两个或以上区间内。在这里,可以利用一个\(tag\)数组记录块是否需要整体翻转。

同时在分块内,一个二进制串可以被当成一个整数,块内的\(0/1\)的贡献可以被预处理。在这里,我们设\(L\)位存储每个整数的左连续1长度,\(R\)为右连续1长度,\(cnt\)数组存储每个整数的二进制表示中,所有连续1字段的贡献。

Submission

牛客暑假集训营3 A
题意:现有一段正整数序列\(f_{i}\),构造一个\(n\)阶矩阵\(A\),使得第\(i\)行和第\(i\)列的\(mex\)都为\(f_{i}\)
题解:

构造一个在\(i\)\(i\)列除0之外,1到\(i+1\)全部出现的矩阵,如下所示。

\[\begin{matrix} 1 & 2 & 2 & \cdots & 2 \\ 2 & 1 & 3 & \cdots & 3 \\ 2 & 3 & 1 & \cdots & 4 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ 2 & 3 & 4 & \cdots & 1 \end{matrix} \]

然后根据\(f[i]\),消去对应行列的\(f[i]\)即可。

牛客暑假集训营3 E
题意:每次可以选择一个索引和一个数,使两索引对应的数除或乘(如果是除需要是因数),问是否有有限次操作是所有数都相等。
题解:

卡人的地方在于需要预处理所有质数和区间内所有数的最小非1因数……

Submission

牛客暑假集训营5 J
题意:一个\(n*m\)的矩阵,其中0代表白色,1代表黑色,黑色每秒向上下左右扩散一格,现还能在已有的白色单元格上选择一个变成黑色,求整个矩阵变成黑色的最短时间。
题解:

首先用\(BFS\)求出每个白点变成黑色的最短时间。对于原题中的"最短时间"考虑二分答案,对于每次循环中的答案,考察当前最短时间超过该答案的点,并求出四向的边界点。这里需要注意的是,答案实际上是与最近黑点的曼哈顿距离,在求四边边界时,实际上是一个斜着的四方形,为了方便计算,需要转成切比雪夫距离后,判断其边界是否在\(2*d\)之内。

卡点:判断切比雪夫距离时,最大值得设成负数,设成0会wa 14%左右的点

WA Submission AC Submission

posted @ 2025-07-17 19:24  AboveFrost  阅读(23)  评论(0)    收藏  举报