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\)

首先是一些转换:

posted @ 2026-01-09 21:08  qwq_123  阅读(8)  评论(0)    收藏  举报