zoukankan      html  css  js  c++  java
  • 【meet in the mid】【qbxt2019csp刷题班day1C】birthday

    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) 时,一定至少有两个不同的选择得到了相同的权值。考虑这两个选择可能会选择相同的元素,那么直接将这些相同的元素都去掉,由于去掉的元素相同,最终得到的权值和依然是相同的,并且两个集合无交。因此这种情况一定能实现。

    解方程

    [2^{len} > len imes v ]

    两侧同时取 (log),整理得

    [len - log len > log v ]

    显然 (v) 取最大值时,左侧取最大值,因此有

    [len - log len > 10 ]

    显然当 (len) 充分大时,左侧的值与 (len) 正相关,枚举 (len) 得到

    [len > 13 ]

    因此当 (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 天下第一

  • 相关阅读:
    vue3.0基本使用
    node 版本升级
    Steam游戏《Northgard(北境之地)》修改器制作
    万能WEB弹出框,js随意适配
    数据湖了解
    操作系统(一)
    无题
    基于林业害虫识别系统的缺陷分析
    美化Android下拉刷新
    软件测试
  • 原文地址:https://www.cnblogs.com/yifusuyi/p/11615771.html
Copyright © 2011-2022 走看看