VPor做题记录5
The 3rd Universal Cup. Stage 39: Tokyo
K-rep Array
给定一个包含 \(-1\) 的字符串 \(S\),定义一个字符串 \(T\) 是好的当且仅当 \(T\) 是 \(S\) 的循环串(即 \(S\) 是 \(T\) 无限重复串的前缀)
问对每一个 \(i=1,2,..,n\) 是否有将 \(-1\) 替换的方案,使得存在长度为 \(i\) 的好的串。
数据范围:\(N\le 2\times 10^5\)
字符串是 好的 当且仅当不存在 \(i,j\) 满足 \(S_i\neq -1,S_j \neq -1,S_i\neq S_j\) 且 \((i−j) \bmod K=0\)。所以我们可以先计算有哪些 \(d\) 使得存在满足上述条件的 \(i,j\) 满足 \(i−j=d\),然后扩展到每个 \(d\) 的约数。
然后有 FFT 处理字符串的算法:
求 \(f_d=\sum_{i-j=d}(S_i+1)(S_j+1)(S_i-S_j)^2\),则上述条件等价于 \(f_d\neq 0\) 。
The 2025 China ICPC Training Camp. Day 1: Romania Contest
Ed, Edd n Eddy
给定一个字符串 \(s\), 找到最长的子串 \(t\) 满足如下条件:
- \(t\) 在 \(s\) 中只出现一次.
- \(t\) 的每个真子串在 \(s\) 中出现至少两次.
数据范围:\(|S|\le 10^5\) 。
首先要注意的是 \(S[l,r]\) 的每个真子串在 \(s\) 中出现至少两次 实际上只要判断 \(S[l,r-1]\) 和 \(S[l+1,r]\) 在 \(S\) 中出现两次。
" \(S[l,r]\) 在 \(s\) 中只出现一次 " 和 " 判断 \(S[l,r-1]\) 在 \(S\) 中出现两次" 是好处理的。
\(S[l+1,r]\) 在 \(S\) 中出现两次,我们可以枚举出现了多次的子串节点 \(p\),然后再枚举下一个字符 \(ch\),看是否存在 \(tr[p][ch]\) 这个子串节点,并且由于 \(p+ch\) 表示的子串只是 \(tr[p][ch]\) 的一部分,所以要看是否包含了 \(tr[p][ch]\) 中最短的那个。
(The Amazing World of) Gumball
给定一棵树, 你需要为每个点染一个颜色 \(s_i\), 满足每种颜色的点都形成一个树上的链. 输出字典序最小的染色方案.
数据范围:\(n \le 10^5\).
首先有 \(O(n^2)\) 的暴力,就是对于一条链去向两端去找最小的id,然后去延伸。
然后考虑用数据结构去优化上面的过程。
发现难点在于:
- 在树上删去点
- 找一个连通块内的最小值。
但你会发现这个在树上删去点的操作可以适配 平衡树 的split操作,那么就可以用平衡树维护上面的过程,这样的复杂度就是 \(O(n\log n)\) 的。
The 2025 China ICPC Training Camp. Day 3: Peking U Contest
Belinda Says
在一个长度为 \(n\) 的排列中,选择 \(k\) 个数去随意重排这 \(k\) 个数,求能得到的最小字典序的排列。
数据范围: \(n\le 10^6\)
这个题提醒了我们要想清楚再去写。
肯定贪心的选,如果剩余的 \(k\ge 2\) 的话,那肯定可以选择 第 \(i\) 个位置 和 \(i\) 这个数。
现在考虑 \(k=1\) ,那么就是考虑第 \(i\) 个位置能否替换成更优的数,考虑:
- 若 \(i\) 这个位置已经被选择,那么此时 \(i\) 这个数就是选择的数中最小的
- 若没有被选,就是本身。
然后考虑这个数是否比后面剩下的数中最小的要大,是的话就可以找到答案了。
Hair Rope
有一个长为 \(L\) 的绳子, 随机选取 \(n − 1\) 个位置 (不一定是整数) 将其分为 \(n\) 段, 对每个 \(0 \le i \le n\) 计算恰有 \(i\) 段长度 \(> K\) 的概率。
数据范围: \(n\le 3000\)
原来这一类实数上的操作也是可以用容斥的。
考虑求 \(f_i\) 表示至少有 \(i\) 条是 \(>K\) 的概率,然后求容斥求 \(g_i\) 表示恰好有 \(i\) 条的概率。
Gun
给定一个 \(n\times m\) 的矩阵 \(a_{i,j}\) , 值域为 \(k\), 问最少修改多少位置可以使得所有相邻位置的数互不相同.
\(n\times m \le 10^5,k\ge 5\) 。
由于 \(k\ge 5\) ,当调整一个格子的信号时, 总可以将其调整至与周围格子的信号不同. 故问题可以化为:选择尽量少的格子, 使得任意同信号的相邻格子至少有一者被选中.
所以可以转换为二分图最小点覆盖的问题。但由于题目中要求具体方案,所以我们需要得到最小点覆盖的方案:
- 最小点覆盖 等于 最小割:考虑一条边,我们要么舍去左边点的贡献,要么舍去右边点的贡献。
- 最小割的方案:等价于将 左边的点和右边的点 划分成两个部分,使得两部分之间的流量最小,由于这部分等于最大流,那么划分的方案就是 \(S\) 能到的点为一部分,剩下的为一部分。
- 最小点覆盖等于 \(n-\)最大独立集:考虑点覆盖的补集就是独立集。
给定一个长为 \(n\) 的序列 \(a\). 序列的每个位置可以分为三种类型 \(K,L, R\). 一个序列合法当且仅当可以通过如下操作将所有 \(a_i\) 变为 \(0\):
- 选择 \(i < j\) 且满足 \(i, j\) 的类型分别为 \(L, K\) 或 \(K, R\)
- 将 \(a_i, a_j\) 减去相同的正数.
给定所有 \(K\) 类型的位置, 问有多少种将剩下位置分配为 \(L, R\) 类型, 使得序列合法。
数据范围:\(n\le 2000,\sum a_i\le 10000\)
首先对于一个已经填好的情况,有贪心的策略使得该状况尽可能的合法:
按顺序从左到右贪心,一个 \(K\) 的位置一定优先和右边最近的 \(R\) 尝试互相抵消;如果右
边没有 \(R\) 了, 再去尝试左边的 \(L\). 那么对这种贪心下最后一个和 \(R\) 进行抵消的 K 类位置, 它右边的所有 \(K\) 都只和 \(L\) 做抵消, 左边的所有 \(K\) 都只和 \(R\) 做抵消.
然后考虑计数,为了不重不漏,我们要对每个填的情况找一个唯一的地方去计数,发现在上面的贪心中,中间选择的 \(K\) 是唯一的地方。
所以我们可以设 \(f_{i,j,k}\) 表示枚举到第 \(i\) 个位置, 目前得到 \(L\) 类位置的和为 \(j\), 还未被抵消的 \(K\) 类位置和 (即 \(K\) 类位置和减 \(R\) 类位置和, 转移中一直保证其为非负即可) 为 \(k\) 的方案数 然后可以发现对于一个 \(i,k\) ,\(j\) 是已知的,所以这部分的复杂度就是 \(O(n\sum a_i)\)
最后枚举往后匹配的 \(K\) 的个数是多少,枚举左边剩余的 \(L\) 的个数是多少,然后前后匹配一下计算合法的贡献就可以了。
CCPC Final 2021
jwfw.harie.edu
\(n\) 道题目,每道题正确选项只有 \(A,B,C,D\) 中的一个,\(m\) 次尝试,给出选项和正确的个数,求出符合情况的正确答案的方案数。
数据范围:\(n\le 10,\sum m ,m \le 20000\)
考虑meeting in middle,问题是这里有 \(m\) 次尝试,相当于要找到 \([a_1,a_2,...,a_m]+[b_1,b_2,...,b_m]=[c_1,c_2,...,c_m]\) 这样的 \((a,b)\) 对数,这样一般是不好做的。
但是你可以使用hash,这样就可以用一个数表示一个序列了。
Shuttle Bus
给定⼀棵树上每个点的职⼯数,现在需要选⼀个点作为⼯⼚新址,并可以设置最多 \(k\) 条从⼯⼚出发的
班⻋线路,每位职⼯会⾛到最近的班⻋经过的点坐班⻋上班,求每⼀个点作为选址时最优班⻋设置
下的最少总步⾏距离。数据范围: \(n\le 2\times 10^5\)
首先是一些转换:

浙公网安备 33010602011771号