• 【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 天下第一

  • 相关阅读:
    iOS10 的适配问题,你遇到了吗?导航栏标题和返回按钮神奇的消失了
    如何在获取不到第一响应者控件时移除键盘
    类名与字符串的互转
    clang format 官方文档自定义参数介绍(中英文)
    clang format 自定义样式常用参数说明
    Xcode 设置代码不自动换行
    企业项目如何打包成.ipa文件
    多个过渡动画效果
    压栈过渡动画
    底部不规则导航栏2
  • 原文地址:https://www.cnblogs.com/yifusuyi/p/11615771.html
Copyright © 2020-2023  润新知