Normal Story

2026牛客暑期多校训练营4

哦卡哇伊阔多

比赛概况

3/12

这次比赛题目偏难,很有思维难度。依旧有很多没有学过的,现场也没有科研出来。比较签到的题也很考验思维,做了很久很久。难题想的时间比较少,也没有做出来,都是那种只要想到了第一步,后面只需要花时间慢慢推,很能够顺理成章地想到,主要在于第一步的转化太难想到了(对于我来说)。

部分题目

什么时候才能把部分两个字删掉

B

给定一个正整数 \(p\),需要寻找三个正整数 \(x_1, x_2, q\),满足 $$ 1 \le x_1 < q,\quad 1 \le x_2 < p, $$ 以及 $$ x_1^2 \equiv p \pmod{q},\qquad x_2^2 \equiv q \pmod{p}. $$

范围限制: $$ 1 \le T \le 10^4,\quad 2 \le p \le 10^9,\quad 1 \le q \le 10^{12} $$

一上来就看的,看了很久也没有想到什么,想过BSGS,没想起来。然后觉得如果p是合数的话太难做了,遂放弃。后来感觉不对劲,过的人太多了,于是考虑 \(p=q\),也不太行。后来队友想到 \(x_1^2=x_2^2=p+q\) ,然后因为 \(p+q=x^2\) ,当 \(p\) 足够大时,找到一个最近的满足条件的 \(q\) 使得 $x\approx\sqrt{2p} $ 。\(P\le3\) 时特判一下就好了。等会复习一下BSGS。

I

定义字符串序列 $$ T_1 = \text{Rounddog},\quad T_i = T_{i-1} + g \quad (i>1) $$ 给定一个字符串 \(S\) 和一个整数 \(k\)。考虑 \(S\) 的所有循环移位,求其中有多少个循环移位包含 \(T_k\) 作为连续子串。

数据范围: $$ 1 \le t \le 10^5,\quad 1 \le |S|,\sum|S| \le 10^5,\quad 1 \le k \le 100 $$

我的方法略显麻烦,但是想的快,打的也还算快,实现得不错。先把原串复制一份放在末尾,然后找前 \(|S|\) 个位置哪些能作为开头,找到每一个能匹配的开头位置 \(i\),然后 \([max(i-|S|+|T|,0),i]\) 都能作为开头,用差分实现区间加。

D

想到了一点正确的雏形,然后把奇数的情况解决了。感觉不太像分治,后面打了一个表,找规律把偶数的情况也补全了。看着表解释很好解释,但是自己从头开始想的话还是很难想。

C

有 \(n\) 个程序需要在相同的 \(m\) 个测试点上重新评测,所有程序使用同一个测试点顺序。 程序 \(i\) 在测试点 \(j\) 上需要运行 \(d_{i,j}\) 的时间,并且该程序在该测试点上的结果已经确定为通过或不通过。评测一个程序时,会按照给定顺序依次运行测试点;一旦某个测试点不通过,就在完成该测试点后立即停止评测该程序。若程序通过所有测试点,则会运行完整个测试点序列。 你可以在评测开始前任意重排这 \(m\) 个测试点。求完成所有 \(n\) 个程序评测所需的最小总时间。 \(1 \le n \le 2 \cdot 10^4,\ 1 \le m \le 20,\ 1 \le d_{i,j} \le 10^9\)。

状压dp,令 \(dp_s\) 为已经选完这些s中为1的测试点花费的最小时间,\(T_{i,s}\) 为通过了测试s还在运行的程序在i这个测试耗费的时间的总和。\(dp_s'= \min\limits_{i\in s}dp_s+T_{i,s}\) ,考试的时候怎么也想不到如何求 \(T_{i,s}\) ...... 比如第 \(i\) 个程序通过的测试点的集合为 \(p\) ,那么它会对所有 $T_{k,s\in p} $ 都贡献 \(d_{i,k}\) 。问题转化成如何给子集中的每一个都不重不漏加上本身,就是高维前缀和。就像点动成线,线动成面,面动成体一样。枚举每个维度,然后把所有这一个维度为1的状态加到这一个维度为0的状态(这两个状态中其他维度对应相同,只有枚举到的这个维度不同),求前缀和。

F

定义序列 \(b = (b_1,b_2,\dots,b_m)\) 是合法的,当且仅当对于所有 \(2 \le i \le m\),都有 $$ 2b_{i-1} \le b_i \le 3b_{i-1}. $$ 特别地,长度为 \(1\) 的序列一定合法。 给定一个长度为 \(n\) 的正整数序列 \(a\),需要回答 \(q\) 个区间询问。每次给定区间 \([l,r]\),求 \(a_l,a_{l+1},\dots,a_r\) 中最长合法子序列的长度。所选元素不要求连续,但必须保持相对顺序。 $$ 1 \le n,q \le 2 \cdot 10^5,\quad 1 \le a_i \le 10^{18},\quad 1 \le l \le r \le n $$

知道序列长度为 \(log\) 级别的,但是不知道该怎么用,很巧妙,把这个长度塞到下标上。令 \(t_{i,j}\) 代表以 \(j\) 这个值结尾,长度为 \(i\) 的,序列中最大的起始坐标。每个点的转移是从一个区间转移过来。从左往右扫描,于是便能确保序列的最大下标不超过当前枚举的 \(i\) 。时间复杂度 \(O(n\log n\log \max_{1\le i\le n} a_i)\) 。后面想怎么做都可以了。判断是否有最大值大于 \(l\) 。

K

给定一棵有 \(n\) 个点的树 \(T\)。递归定义它的一棵点分树如下:对于任意非空连通诱导子图 \(S\),可以任意选择一个点 \(c \in S\) 作为当前分治中心,并令 \(c\) 成为 \(S\) 的点分树的根。随后从 \(S\) 中删除 \(c\),对剩余的每个连通块分别递归分治,并将这些连通块的点分树根作为 \(c\) 的儿子。 这里选择的分治中心不要求是重心,可以是当前连通块中的任意点。若两棵点分树中至少有一个点的父亲不同,则认为它们不同。 求树 \(T\) 一共可以产生多少棵不同的点分树,答案对 \(10^9 + 7\) 取模。 \(1 \le n \le 3000,\ 1 \le u,v \le n\)

这道题最后看了一下,也看不出什么名堂。关键还是状态的设计!!!状态设计对了什么都好说!吗 思路不清晰还是要调很久。 先让1为根,令 \(dp_{u,i}\) 为以 \(u\) 为根的子树,点分树中这个子树的根与 \(u\) 的距离是 \(i\) 的情况有多少种。特别的,\(dp_{u,0}\) 代表直接选了 \(fa_u\) ,把 \(fa_u\) 与 \(u\) 断开了,就是 \(i\ge1\) 的 \(dp\) 值的和。\(dp\) 对应情境就是,在 \(u\) 的子树里面选了 \(i-1\) 个数后选择了 \(u\) ,对 \(fa_u\) 贡献了多少种情况。之后 \(u\) 的父亲就不与 \(u\) 联通了,也不用考虑这个子树了。思考怎么转移,假设现在已经遍历到了孩子 \(v\) 。类似卷积的形式,\(dp_{u,i}=\sum{(dp_{u,i-j}+\sum\limits_{k\ge j}dp_{v,k})\binom{i-1}{j}}\) ,有几个细节:\(i\ge 1\) , \(dp_{u,0}\) 最后单独求;乘组合数是因为不同子树中先选哪个不影响;\(j=0\) 时代表不会先选 \(v\) 中的点,必定是先选 \(u\) ;\(k\ge j\) 保证能选到 \(j\) 个点,此时还 \(v\) 与 \(u\) 依然联通,并且按顺序选出前 \(j\) 个点。单独看这 \(v\) 个这子树内的话,相当于选了按原顺序选了 \(j\) 个点后选了 \(u\) 然后 按原顺序选到第 \(k\) 个点,即 \(v\) 。本质上就是提出了联通时的 \(j\) 个点拿出去求组合,后面 \(k-j\) 个点在 \(v\) 子树外就没有顺序要求了,还是原来的贡献。剩下的就是前缀和优化和 \(dp\) 时的一个启发式合并防止超时。略加思考和直觉,每个子树内部的讨论必定能正确地对子树内部的点分树正确地分类。

总结

思维题特别是构造题不一定要考多难的算法,但是一定很考思维。

理不清楚时,尝试用数学或者编程语言写下来,可能可以更好地观察性质。

适当压力队友?

重要的题打表,暴力,对拍等不要嫌麻烦。最优,计数等等。

log级别的东西可以放在下标。求最优可以转化成对答案的判断。

对于dp状态的设计:直接设计成答案,对答案进行分类,针对有后效性的部分设置一个状态。

对于dp正确性的验证:最优,想一下最优情况可不可能没被转移到;计数,dp定义是否补充不漏,转移是否不重不漏。

纸上谈兵罢了。

posted @ 2026-07-30 19:45  _LLD  阅读(15)  评论(0)    收藏  举报