Description
给定一个长度为 (n) 序列,值域为 ([1, v]),每次选择一段区间,要求在这个区间上选择一些元素加入到两个集合中,每个元素要么不选要么只能加入一个集合,要求两个集合非空且元素和相等,问能否实现。
同时要求区间修改元素为自身的立方对 (v) 取模的结果。
Limatations
(1 leq n leq 10^5),(1 leq v leq 1000)
Solution
考虑一段长度为 (len) 的区间,考虑每个点有选入集合和不选入集合两种可能,所以所有选择的种数一共有 (2^{len}) 种。考虑由于值域为 (v),所以可能出现的权值和一共有 (len imes v) 种。考虑当 (2^{len} > len imes v) 时,一定至少有两个不同的选择得到了相同的权值。考虑这两个选择可能会选择相同的元素,那么直接将这些相同的元素都去掉,由于去掉的元素相同,最终得到的权值和依然是相同的,并且两个集合无交。因此这种情况一定能实现。
解方程
两侧同时取 (log),整理得
显然 (v) 取最大值时,左侧取最大值,因此有
显然当 (len) 充分大时,左侧的值与 (len) 正相关,枚举 (len) 得到
因此当 (len geq 14) 时,可以直接输出 (Yes),下面考虑 (len leq 13) 的情况。
考虑最简单的方法是爆搜,枚举每个元素不选还是选入集合 (A) 还是选入集合 (B),时间复杂度 (O(3^{len})),由于一共有 (m) 次查询,时间复杂度超标。
考虑进行 meet in the middle
,先搜索区间前 (6) 个元素的所有情况,记录所有可能的 (A) (B) 两集合元素和之差,再搜索区间后 (7) 个元素的情况,同样记录所有可能的元素和之差。一旦有一个差在两侧都有出现,那么只需要一个集合左边选较大的右边选较小的;另一个集合左边选较小的右边选较大的,即可得到两个合法的集合,反之则不能得到。
因此这这样的复杂度为 (O(2^{len / 2})),由于有 (m) 次操作,实际运算量与 (2^7 imes m) 同阶,可以通过本题。
考虑区间修改操作,只需要分块或者线段树即可快速维护。
Summary
zxy 天下第一