20241021-1031杂题记录
gym105173I
题意:长度为 \(n\) 的序列,\(1 \le a_i \le k\)。如果 \([i, i + k − 1]\) 是 \(k\) 阶排列,则这个区间所有位置都是好的。
求所有位置都是好的的序列数量,\(n\le 10^5, k\le 10^3\)。
实际上是用若干个排列去覆盖整个序列。
设 \(f_i\) 表示前缀 \(i\) 中最后一个完整排列以 \(i\) 结尾的方案数。
枚举上一个完整排列的结尾:
\(g_j\) 是在 \(1 \sim k\) 的排列后面接上 \(j\) 个数,满足 \([j + 1, j + k]\) 是排列,\(\forall 1 \le l < j,\ [l + 1, l + k]\) 不是排列的方案数。
总方案为 \(j!\),现在减掉不合法的,枚举第一个不合法的位置 \(l\):
时间复杂度 \(O(nk)\)。submission
gym105173L
题意:求操作序列个数,使得 ()
能变为合法括号序列 \(A\),每次可以:
- 在序列最右边添加一对括号,即 \(S\to S()\)
- 选取合法区间 \([l, r]\),使 \(S[l, r] \to (S[l, r])\)。
(......)
能被加入当且仅当其范围内所有 ()
已被加入。
换句话说,他能加入当且仅当 \(k\) 已被加入,其中 \(k\) 为范围内最后一个 ()
的标号。
这能够推出,第 \(i\) 个()
能被加入当且仅当 \(i - 1\) 已被加入。
设 ()
数量为 \(m\),不妨先排出操作序列 \(1, 2, \cdots, m\)。
从后往前考虑(这保证了 \(k_i\) 是单调不升的)每个 (.......)
,在 \(k_i\) 后面选一个位置插入,系数容易计算。
时间复杂度 \(O(n)\)。submission
P10091 [ROIR 2022 Day 2] 分数排序
单组询问显然可以二分,\(a, b\) 都提前排序后存在一定单调性,能做到 \(O(n)\) check。
时间复杂度 \(O((n + q) \log n)\),需要考虑精度问题。
P10092 [ROIR 2022 Day 2] 网络系统升级计划
设 \(f_{u, i}\) 表示以 \(u\) 为根的子树中,与儿子相连的边选了 \(i\) 条,能选的最大边数,同时记录边权和 \(g_{u, i}\)。
根据选不选 \((u, v, w)\) 有两种转移:\(f^\prime_{u, i} \gets f_{u, i - 1} + f_{v, i} + w,\ f^\prime_{u, i} \gets f_{u, i} + f_{v, i}\)。
\(f_{v, k}\) 只能第二种转移到 \(f_u\),时间复杂度 \(O(nk)\)。
注意到对 \(u\) 而言 \(f_v\) 只有 \(i = k\) 和 \(i < k\) 两种,因此空间可以做到线性。
P10093 [ROIR 2022 Day 2] 礼物
题意:删除 \([l, r]\) 中的前 \(k\) 大值,最大化剩余元素和,\(1 \le n \le 2 \times 10^5,0\le k \le \min(100, n)\)。
相同值的元素之间存在不确定性,规定先删大再删小,值相等的先删下标大的。
枚举 \(i\),设辅助数组 \(\{b\}\),其中 \(b_j = [i, j \text{ 在同一区间时 } j \text{ 比 } i \text{ 先删除}]\),\(b_i = 1\)。
\(i\) 被第 \(k\) 个删除当且仅当 \([l, r]\) 恰好包含 \(k\) 个 \(1\)。
只关心 \([l, r]\) 最左最右 \(1\) 的位置 \([l^\prime, r^\prime]\),这样合法区间数减少到 \(O(k)\)。
设 \(pre_i,nxt_i\) 表示 \(i\) 前/后第一个 \(1\) 的位置,答案即:
中间移项容易在枚举 \([l^\prime, r^\prime]\) 时 \(O(1)\) 维护。
查询某一区间的最大前缀/后缀和可以 ST 表做到 \(O(n\log n)\) 预处理 \(O(1)\) 询问。
从大到小在值域上扫描,链表维护每个 \(1\) 的前驱后继,时间复杂度 \(O(n\log n + nk)\)。
P10087 [ROIR 2022 Day 1] 跳跃机器人
记 \(f_i\) 表示从 \(i\) 出发的答案。
不难得到,\(f_1 = \max(d_1, d_2 - 1, d_3 - 2, \cdots)\)。
考虑 \(f_i\) 需要满足的必要条件:
- \(f_i \ge d_i\)。
- \(f_i + 1 \ge f_{i + 1}\)。
两个条件同时成立就是充分的,即 \(f_i = \max(d_i, f_{i + 1} - 1)\)。
这样就在 \(O(n)\) 时间内递推出所有 \(f\)。
P11088 [ROI 2021 Day 1] 穿孔卡片
从上往下放置每个卡片。
卡片可以放置当且仅当其未被挡住且不为空的位置与答案串相同。
把当前卡片的矛盾位置(没被挡住且与答案不同)视为其度数。
能被加入当且仅当其度数为 \(0\),写一个拓扑排序状物即可。
P10089 [ROIR 2022 Day 1] 回文数组
哈希的结果是可加的,设正串的哈希值为 \(h\),反串为 \(h^\prime\)。
那么两部分合法当且仅当 \(ha + hb = ha^\prime + hb^\prime\),移项即 \(ha - ha^\prime = hb - hb^\prime\)。
当长度确定时不同的 \(h - h^\prime\) 只有 \(O(n)\) 个,把他丢进桶里 check 即可。
如果奇偶性确定,答案是可二分的,时间复杂度 \(O(n\log n)\),需要双哈希。
CF568E(加强)
题意:给出一个不完整排列 \(\{a\}\),\(a_i = 0\) 表示不确定。补全剩余位置并最大化 LIS。
钦定某些原先位置保留在 LIS 当中,形如 \(\{a_{p_1}, a_{p_2},\cdots, a_{p_k}\}\)。
现在要在 \(p_i\) 和 \(p_{i + 1}\) 当中为 \(0\) 的位置插入一些 \(x\),必须满足 \(a_{p_i} < x < a_{p_{i + 1}}\)。
对于每个 \(i\),\(x\) 的值域互不相交,可以对此进行 DP。
设 \(f_i\) 表示保留 \(a_i\) 且以 \(i\) 结尾的 LIS 长度,从某个 \(j < i \land a_j < a_i\) 转移:
记 \(c_i = \sum_{j < i} [a_j = 0],\ d_i = (a_i - 1) - \sum[a_j < a_i\land a_j \ne 0]\)。
将 \(\min\) 拆成两种不同的偏序关系,分治进行转移。时间复杂度 \(O(n\log^2n)\)。
P4093 [HEOI2016/TJOI2016] 序列
设 \(b_i\) 表示 \(i\) 这个位置的历史最大值,\(c_i\) 表示历史最小值。
存在显然的转移:
转移需要满足三维偏序,考虑分治。
solve(l, mid)
解决左区间;左区间更新右区间;solve(mid + 1, r)
右区间内部更新。
这样在左区间更新右区间时,左边的DP值已经是最终的了。
时间复杂度 \(O(n \log^2n)\)。submission
P7170 [COCI2020-2021#3] Sateliti
设计一种二维哈希:\(h_{i, j} = p^iq^js_{i, j},\ H_{i, j} = \sum_{a \le i, b \le j} h_{i, j}\)。
这样可以 \(O(1)\) 获取某个子矩阵的哈希值(二维前缀和)。
枚举最终方案的左上角,二分比对两种方案最长公共行数,再二分出最长公共列的位置。
把原矩阵复制成四份能够少判很多情况,时间复杂度 \(O(nm\log nm)\)。
P7172 [COCI2020-2021#3] Specijacija
把原树划分为若干长链,两点在长链上上下移动不会改变他们的lca。
给每个长链选出代表点,所有叶子节点以及 \(a_i\) 构成一颗点数为 \(2n + 1\) 的新树。
主席树自下而上维护每个点对应长链上的代表点,每到一层相当于合并两条链(删一个代表点,改一个代表点)。
注意询问是祖先后代关系的情况,时间复杂度 \(O(n\log n)\)。
1023模拟赛T1
gym105173I
题意:长度为 \(n\) 的序列,\(1 \le a_i \le k\)。如果 \([i, i + k − 1]\) 是 \(k\) 阶排列,则这个区间所有位置都是好的。
求所有位置都是好的的序列数量,\(n\le 10^5, k\le 10^3\)。
实际上是用若干个排列去覆盖整个序列。
设 \(f_i\) 表示前缀 \(i\) 中最后一个完整排列以 \(i\) 结尾的方案数。
枚举上一个完整排列的结尾:
\(g_j\) 是在 \(1 \sim k\) 的排列后面接上 \(j\) 个数,满足 \([j + 1, j + k]\) 是排列,\(\forall 1 \le l < j,\ [l + 1, l + k]\) 不是排列的方案数。
总方案为 \(j!\),现在减掉不合法的,枚举第一个不合法的位置 \(l\):
时间复杂度 \(O(nk)\)。submission
gym105173L
题意:求操作序列个数,使得 ()
能变为合法括号序列 \(A\),每次可以:
- 在序列最右边添加一对括号,即 \(S\to S()\)
- 选取合法区间 \([l, r]\),使 \(S[l, r] \to (S[l, r])\)。
(......)
能被加入当且仅当其范围内所有 ()
已被加入。
换句话说,他能加入当且仅当 \(k\) 已被加入,其中 \(k\) 为范围内最后一个 ()
的标号。
这能够推出,第 \(i\) 个()
能被加入当且仅当 \(i - 1\) 已被加入。
设 ()
数量为 \(m\),不妨先排出操作序列 \(1, 2, \cdots, m\)。
从后往前考虑(这保证了 \(k_i\) 是单调不升的)每个 (.......)
,在 \(k_i\) 后面选一个位置插入,系数容易计算。
时间复杂度 \(O(n)\)。submission
gym105173G
题意:\((l, r, p, q)\) 表示只保留 \(i\) 满足 \(l \le i \le r\) 且 \(a_i = p \lor a_i = q\),求剩余位置的逆序对数。
数据范围:\(1 \le n, m \le 10^5,\ 1 \le a_i \le n\)。
P10091 [ROIR 2022 Day 2] 分数排序
单组询问显然可以二分,\(a, b\) 都提前排序后存在一定单调性,能做到 \(O(n)\) check。
时间复杂度 \(O((n + q) \log n)\),需要考虑精度问题。
P10092 [ROIR 2022 Day 2] 网络系统升级计划
设 \(f_{u, i}\) 表示以 \(u\) 为根的子树中,与儿子相连的边选了 \(i\) 条,能选的最大边数,同时记录边权和 \(g_{u, i}\)。
根据选不选 \((u, v, w)\) 有两种转移:\(f^\prime_{u, i} \gets f_{u, i - 1} + f_{v, i} + w,\ f^\prime_{u, i} \gets f_{u, i} + f_{v, i}\)。
\(f_{v, k}\) 只能第二种转移到 \(f_u\),时间复杂度 \(O(nk)\)。
注意到对 \(u\) 而言 \(f_v\) 只有 \(i = k\) 和 \(i < k\) 两种,因此空间可以做到线性。
P10093 [ROIR 2022 Day 2] 礼物
题意:删除 \([l, r]\) 中的前 \(k\) 大值,最大化剩余元素和,\(1 \le n \le 2 \times 10^5,0\le k \le \min(100, n)\)。
相同值的元素之间存在不确定性,规定先删大再删小,值相等的先删下标大的。
枚举 \(i\),设辅助数组 \(\{b\}\),其中 \(b_j = [i, j \text{ 在同一区间时 } j \text{ 比 } i \text{ 先删除}]\),\(b_i = 1\)。
\(i\) 被第 \(k\) 个删除当且仅当 \([l, r]\) 恰好包含 \(k\) 个 \(1\)。
只关心 \([l, r]\) 最左最右 \(1\) 的位置 \([l^\prime, r^\prime]\),这样合法区间数减少到 \(O(k)\)。
设 \(pre_i,nxt_i\) 表示 \(i\) 前/后第一个 \(1\) 的位置,答案即:
中间移项容易在枚举 \([l^\prime, r^\prime]\) 时 \(O(1)\) 维护。
查询某一区间的最大前缀/后缀和可以 ST 表做到 \(O(n\log n)\) 预处理 \(O(1)\) 询问。
从大到小在值域上扫描,链表维护每个 \(1\) 的前驱后继,时间复杂度 \(O(n\log n + nk)\)。
P10087 [ROIR 2022 Day 1] 跳跃机器人
记 \(f_i\) 表示从 \(i\) 出发的答案。
不难得到,\(f_1 = \max(d_1, d_2 - 1, d_3 - 2, \cdots)\)。
考虑 \(f_i\) 需要满足的必要条件:
- \(f_i \ge d_i\)。
- \(f_i + 1 \ge f_{i + 1}\)。
两个条件同时成立就是充分的,即 \(f_i = \max(d_i, f_{i + 1} - 1)\)。
这样就在 \(O(n)\) 时间内递推出所有 \(f\)。
P11088 [ROI 2021 Day 1] 穿孔卡片
从上往下放置每个卡片。
卡片可以放置当且仅当其未被挡住且不为空的位置与答案串相同。
把当前卡片的矛盾位置(没被挡住且与答案不同)视为其度数。
能被加入当且仅当其度数为 \(0\),写一个拓扑排序状物即可。
P10089 [ROIR 2022 Day 1] 回文数组
哈希的结果是可加的,设正串的哈希值为 \(h\),反串为 \(h^\prime\)。
那么两部分合法当且仅当 \(ha + hb = ha^\prime + hb^\prime\),移项即 \(ha - ha^\prime = hb - hb^\prime\)。
当长度确定时不同的 \(h - h^\prime\) 只有 \(O(n)\) 个,把他丢进桶里 check 即可。
如果奇偶性确定,答案是可二分的,时间复杂度 \(O(n\log n)\),需要双哈希。
CF568E(加强)
题意:给出一个不完整排列 \(\{a\}\),\(a_i = 0\) 表示不确定。补全剩余位置并最大化 LIS。
钦定某些原先位置保留在 LIS 当中,形如 \(\{a_{p_1}, a_{p_2},\cdots, a_{p_k}\}\)。
现在要在 \(p_i\) 和 \(p_{i + 1}\) 当中为 \(0\) 的位置插入一些 \(x\),必须满足 \(a_{p_i} < x < a_{p_{i + 1}}\)。
对于每个 \(i\),\(x\) 的值域互不相交,可以对此进行 DP。
设 \(f_i\) 表示保留 \(a_i\) 且以 \(i\) 结尾的 LIS 长度,从某个 \(j < i \land a_j < a_i\) 转移:
记 \(c_i = \sum_{j < i} [a_j = 0],\ d_i = (a_i - 1) - \sum[a_j < a_i\land a_j \ne 0]\)。
将 \(\min\) 拆成两种不同的偏序关系,分治进行转移。时间复杂度 \(O(n\log^2n)\)。
P4093 [HEOI2016/TJOI2016] 序列
设 \(b_i\) 表示 \(i\) 这个位置的历史最大值,\(c_i\) 表示历史最小值。
存在显然的转移:
转移需要满足三维偏序,考虑分治。
solve(l, mid)
解决左区间;左区间更新右区间;solve(mid + 1, r)
右区间内部更新。
这样在左区间更新右区间时,左边的DP值已经是最终的了。
时间复杂度 \(O(n \log^2n)\)。submission
P7170 [COCI2020-2021#3] Sateliti
设计一种二维哈希:\(h_{i, j} = p^iq^js_{i, j},\ H_{i, j} = \sum_{a \le i, b \le j} h_{i, j}\)。
这样可以 \(O(1)\) 获取某个子矩阵的哈希值(二维前缀和)。
枚举最终方案的左上角,二分比对两种方案最长公共行数,再二分出最长公共列的位置。
把原矩阵复制成四份能够少判很多情况,时间复杂度 \(O(nm\log nm)\)。
P7172 [COCI2020-2021#3] Specijacija
把原树划分为若干长链,两点在长链上上下移动不会改变他们的lca。
给每个长链选出代表点,所有叶子节点以及 \(a_i\) 构成一颗点数为 \(2n + 1\) 的新树。
主席树自下而上维护每个点对应长链上的代表点,每到一层相当于合并两条链(删一个代表点,改一个代表点)。
注意询问是祖先后代关系的情况,时间复杂度 \(O(n\log n)\)。
P9768 [ROIR 2021 Day 2] A+B
给每一列赋予两种属性:
- 会不会往下一位进位:\(a_i = [x_i + y_i \ge 10]\)。
- 需不需要上一位进位:\(b_i = \left[x_i + y_i + 1 \equiv z_i \pmod {10}\right]\)。
发现 \(a_i\) 的表述还不是很完备,修改为 \(a_i = [x_i + y_i + b_i \ge 10]\)。
所有列转化为 \(\texttt{00},\texttt{01}, \texttt{10},\texttt{11}\) 的形式。
我们发现一旦一个数的第二位为 \(1\),其右边与之相邻的必然满足第一位为 \(1\)。
同理如果一个数的第一位为 \(1\),其左边与之相邻的必然满足第二位为 \(1\)。
最后的答案一定形如 \(\texttt{00}\ \texttt{01}\ \texttt{11}\cdots\texttt{11}\ \texttt{10} \ \texttt{00}\cdots\),即:
- \(\texttt{01}\) 和 \(\texttt{10}\) 数量相等,且两两配对。
- \(\text{11}\) 只能加在一对 \(\texttt{01}\cdots\texttt{10}\) 中间。
- \(\text{00}\) 只能加在开头,结尾,或一对 \(\texttt{10}\cdots\texttt{01}\) 当中。
到此步为止,已经容易计数不考虑前导零的方案数了。
考虑容斥,钦定开头是 \(\texttt{00}\) 或 \(\texttt{01}\),满足 \(x = 0\lor y = 0\lor z = 0\),剩下的部分也容易计数。
gym101754a
给三种字符分别随机一个 \(2 \times 2\) 的矩阵 \(A, B, C\),并求出他们的逆。
一个串合法当且仅当:给 \(a\) 轮流赋权值 \(A,A^{-1}\),同理 \(b, c\),整个序列的乘积是单位矩阵。
这是因为每次必然是相邻相同的字符相消,替换为矩阵后可以用结合律得到 \(I\)。
交换 \(l, r\) 处的两个不同字符,假设为 \(a, b\):
- 替换 \(l, r\)。
- 将 \([l + 1, r - 1]\) 的所有 \(A\) 改为 \(A^{-1}\),\(A^{-1}\) 改为 \(A\)。
- 将 \([l + 1, r - 1]\) 的所有 \(B\) 改为 \(B^{-1}\),\(B^{-1}\) 改为 \(B\)。
枚举哪两种字符参与交换(实际枚举不交换的那个)。
预处理某些东西可以 \(O(1)\) 得到交换后序列的乘积,进一步可写成 \(f(l) \times g(r)\) 的形式。
给矩阵做哈希,在 map
中查找 \(f(l) = g(r)^{-1}\) 的个数。
P11092 [ROI 2021 Day 2] 莫斯科数字
设 \(f_{i, j}\) 表示考虑了后缀 \(i\),后缀最大值是 \(j\) 的答案,复杂度 \(\vert \sum\vert^2n\)
P9863 [POI2021~2022R2] arm
进行如下转换:构造长度为 \(k\) 的数组满足 \(\prod p_i > n\),最小化 \(ka + b(-k + \sum p_i)\)。
(一次 \(1\) 操作,\(p_i - 1\) 次 \(2\) 操作使权值翻 \(p_i\) 倍)。
当 \(\sum p_i\) 确定时,想要最大化 \(\prod p_i\),一定存在最优解满足 \(p_k - p_1 \le 1\)(默认排好序)。
\(p_i = 1\) 是无用的,也就是说 \(k \le \log_2 n\)。
枚举 \(k\),不妨先让 \(p_1 = p_k\),再在满足条件的同时尽可能多的使 \(p_i\) 减一。
P8315 [COCI2021-2022#4] Šarenlist
\(n \le 60, m \le 15\),考虑容斥。
钦定一条链颜色相同,相当于把某个边集合并为连通块,方案数就是 \(k^{\text{连通块个数}}\)。
P8314 [COCI2021-2022#4] Parkovi
二分答案,考虑这么一个贪心:选的点深度越浅越好。
设 \(h_u\) 表示 \(u\) 子树内未被覆盖的点与 \(u\) 的最大距离,\(h_u = \max_{v \in \text{son}(u)} (h_v + w)\)。
这样不是很完备,因为可能 \(v_1\) 中选中的点能覆盖 \(v_2\) 的点。
设 \(f_u\) 表示 \(u\) 子树内被选中的点与 \(u\) 的最小距离,\(f_u = \min_{v\in \text{son}(u)} f_v + w\)。
如果 \(h_v + w + f_u \le mid\),那么他已经被覆盖,没必要贡献给 \(h_u\)。
特别的,如果 \(f_u > mid\),则 \(u\) 本身不被覆盖,应初始化 \(h_u = 0\),否则为 \(-\infty\)。
记 \(u\) 与其父亲直接边权为 \(X\),如果 \(h_u + X > lim\),必须选 \(u\),否则还能选更浅的点。
P9691 [GDCPC2023] Base Station Construction
以区间为切入点不好做(如今年T2的贪心),考虑在数轴上做这个问题。
\(f_i\) 表示考虑了 \([1, i]\),并且钦定选 \(i\) 的答案。
\(f_i\) 能从某个 \(f_j\) 转移过来当且仅当不存在 \(j < l\land r < i\),容易单调队列优化。
P2567 [SCOI2010] 幸运数字
有 \(943\) 个幸运数不是其他幸运数的倍数。
所有组合中,不超过 \(10^{10}\) 的只有 \(10264\) 个,大力搜索即可。
**P4381 [IOI2008] Island **
给出图是一张基环树森林,求所有基环树的直径(最长简单路径)和。
分两类:不经过环,树DP;经过环,求出环上每棵树的最大深度,单调队列优化枚举。
代码写了一坨。submission
P7205 [COCI2019-2020#3] Drvca
以下默认整个数组有序。
\(a_1, a_2, a_3\) 必有其二同属一个集合,不妨钦定 \(a_1, a_2 \in A\)。
贪心的将能选的数都加入 \(A\),剩下的划分给 \(B\)。
如果 \(B\) 不满足条件,考虑从 \(A\) 中反悔。
因为我们已经钦定了 \(A\) 的公差,反悔的部分只能是 \(A\) 的后缀。
从后往前枚举,同时 map
维护 \(B\) 每项的差值及个数,复杂度 \(n\log n\)。
P7981 [JRKSJ R3] system
题意:给定一个序列,每次同时使 \(a_i \gets a_{a_i}\),求 \(k\) 次后的序列。
第一步:\(a_i^1\gets a_{a_i}\)。
第二步:\(a_i^2\gets a_{a_i^1}^1 = a^1_{a_{a_i}} = a_{a_{a_{a_i}}}\),以此类推。
\(i\) 向 \(a_i\) 连边,\(k\) 轮后 \(a_{i}^k\) 对应哪个数,相当于 \(i\) 向父亲跳了 \(2^k\) 步。
原图是一个内向基环树森林。
对于每个点而言,如果 \(2^k\) 小于其深度,直接跳他的 \(2^k\) 级祖先。
否则跳入环中,对环长取余。
AT_dp_y Grid 2
设 \(c(i, j)\) 表示从关键点 \(i\) 不考虑其他限制走到 \(j\) 的方案数。
将关键点排序(\(x\) 为第一关键字,\(y\) 为第二关键字)。
即 \(f(i)\) 表示从起点 \(0\) 走到关键点 \(i\),且中间不经过其他关键点的方案数。
\(f(i) = c(0, i) + \sum_{j = 1}^{i - 1} f(j) \times c(j, i)\),这样就容斥掉了所有非法情况。
P11238 「KTSC 2024 R1」铁路 2
以下默认树的边权为正。
- 距离 \(u\) 最远的点一定是某条直径的一个端点。
- 所有直径重合于一点,或一条路径,路径外的分支长度相等。
具体证明 @dbxxx:Link。
设到 \(u\) 的最大距离为 \(d_u\),对于任意一条直径 \((s, t)\),总有 \(d_u = \max\left(\text{dist}(s, u), \text{dist}(t, u)\right)\)。
通过上述两点是容易说明的。
\(u, v\) 所能产生贡献的上界是 \(\min(d_u, d_v)\),而这是能到达的。
按 \(d_u\) 降序排序,答案为 \(\sum_{i = 0}^{n - 1} i \times d_i\)。
P11240 「KTSC 2024 R2」回文判定
对于每个 \(i \in [1, \lfloor\frac{n}{2}\rfloor)\),调用 \(\text{count_pair}(0, i, n - 1 - i)\)。
记返回值为 \(x\):
- \(x = 0\),一定不是回文。
- \(x = 1\),合法当且仅当 \(s_i = s_{n - 1 - i}\),仍需判断,将 \(i\) 和 \(n - 1 - i\) 加入集合 \(A\)。
- \(x = 3\),\(s_0 = s_{i} = s_{n - i - 1}\),将 \(i\) 加入集合 \(B\)。
调用 \(\text{find_character}(0, A)\),如果存在某个 \(s_0 = s_i\),一定非法。
现在已经检验了所有 \(i \in [1, \lfloor\frac{n}{2}\rfloor),\ s_i = s_{n - 1 - i}\),只剩下 \(s_0\) 与 \(s_{n - 1}\) 的判断。
如果 \(B\) 不为空,\(i \in B\),已经满足 \(s_0 = s_i\),只需调用 \(\text{count_pair}(0, n - 1, i)\) 检验是否为 \(3\)。
否则设 \(i \in A\),如果 \(\text{count_pair}(i, n - 1 - i, n - 1) = 3\),非法。
否则检验 \(\text{count_pair}(i, 0, n - 1)\) 是否为 \(1\),此时询问次数上界恰好达到题目限制。
「KTSC 2024 R2」岛屿
随便取一个三角形,内部加一个点并构造生成树。
不断往上加三角形,加的两条边染不同色即可,是一个拓扑排序状物。
原三角形每个顶点都同时属于两棵生成树。
新加入的点分别与两颗生成树相连,维持了这一性质,且无环连通。
P1117 [NOI2016] 优秀的拆分
记 \(a_i\) 表示以 \(i\) 结尾的 \(\texttt {AA}\) 串个数,\(b_i\) 表示以 \(i\) 开头的 \(\texttt{AA}\) 串个数,则答案为 \(\sum a_i \times b_{i + 1}\),
枚举 \(\texttt{A}\) 的长度 \(L\),每 \(L\) 放置一个关键点:\(L, 2L, 3L \cdots\)。
一个合法的 \(\texttt{AA}\) 串必然横跨相邻的两个关键点。
考虑关键点 \(p_i\) 和 \(p_{i + 1}\),设 \(A= \text{lcs}(pre_{p_i}, pre_{p_{i + 1}}),\ B = \text{lcp}(suf_{p_i}, suf_{p_{i + 1}})\)。
记横跨 \(p_i, p_{i + 1}\) 且长度为 \(2L\) 的 \(\texttt{AA}\) 为关键串,\(p_i, L\) 不同关键串不同。
如果 \(A+ B \le L\),不存在关键串。
否则 \(A + B > L\),记 \(l_i = p_i - A + 1, r_i = p_i + B - 1\),同理定义 \(l_{i + 1}, r_{i + 1}\)。
考虑一个关键串的左右端点 \(l, r\),其中 \(p_i - L < l \le p_i,\ r - l + 1 = 2L\)。
由于 \(s_{l_i - 1} \ne s_{l_{i + 1} - 1}\),一定有 \(l \ge l_i\),同理 \(r \le r_{i + 1}\)。
不难得到 \(l \in [p_i - \min(A, L) + 1, \min(p_i, r_{i + 1} - 2L + 1)]\) 就是全部的关键串集合,差分维护 \(a, b\) 数组。
P2150 [NOI2015] 寿司晚宴
暴力状压每个数的质因子,做 01 背包。
\(f_{i, s, t}\) 表示考虑了前 \(i\) 个数,G 状态为 \(s\),W 为 \(t\) 的方案数,\(s \cap t = \emptyset\)。
对于 \(n \le 500\),至多有一个大于 \(19\) 的质因子。
根据这个大因子进行分组,显然每组至多被一个人选,分组dp即可。
剩下 \(8\) 个小因子继续状压,时间复杂度 \(O(2^{16}n)\),枚举子集优化到 \(O(3^8n)\)。
P2178 [NOI2015] 品酒大会
建出后缀数组。
从大到小枚举 \(r = n - 1 \to 0\)。
加入所有 \(h_i = r\),相当于 \(sa_i\) 和 \(sa_{i - 1}\) 之间连边,边权为 \(r\)。
一个连通块对应 \(h\) 数组上一段连续区间,连通块内任意两点 lcp 不小于 \(r\)。
这恰好满足题目需求。