zoukankan      html  css  js  c++  java
  • CF1083F

    CF1083F [* easy]

    定义操作为:

    选择一个长度为 (k) 的区间 ([l,r]),然后将这个区间异或上 (x)(x) 任意)

    定义序列 (a,b) 的相似值为最少操作多少次使得两者相同。如果不行输出 (-1)

    支持单点修改修改 (a,b),查询两个序列的相似度。

    (k,nle 2cdot 10^5,a_i,b_i<2^{14})

    时限 ( m 4s)

    Solution

    考虑序列 (c=aoplus b),考虑其差分数组 (0,1...n+1),不难发现问题等价于每次选两个距离为 (k+1) 的数异或然后将其变成 (0)

    我们发现操作的顺序对答案没有影响,所以可以考虑从左到右操作。每次将 (c_{i+k+1}') 异或上 (c_i')

    考虑根据下标 (\% k) 的值分类,这样我们得到 (k) 个大小为 (frac{n}{k}) 的数组,我们不难发现点 (x) 对答案的有贡献当且仅当此处前缀异或和不为 (0)

    考虑统计一个序列有多少个前缀异或和为 (0),然后用总数减去即可,(-1) 等价于存在一个结尾不为 (0),那么维护一下结尾 (0) 的数量即可。

    然后不难发现我们的操作等价于后缀异或,由于时限 (4s),值域不是很大,我们考虑一下分块,对每个块维护一下每种值的出现次数,和整体异或标记。

    设块的大小为 (cnt),我们的复杂度为 (qcdot (cnt+frac{n/k}{cnt})),取最优的块大小 (sqrt{n/k}) 得到最优时间复杂度 (mathcal O(qcdot sqrt{n/k}))

    空间复杂度为 (omega cdot ksqrt{n/k})(omegacdot sqrt{nk})

    不过最好还是 (sqrt{n}) 分块,不然空间不太行。

    然后如果 (kge sqrt{n}) 就直接暴力即可。

  • 相关阅读:
    javascript之面向对象学习笔记03
    javascript之面向对象学习笔记02
    javascript之面向对象学习笔记01
    记第一次用Linux搭建LAMP环境
    C#随机数
    Android简单的TXT文件存储
    关于Android的ListView一点使用方法
    Android与C#的socket通讯
    Android调用WebService
    并发编程之进程、线程、同步锁 -1
  • 原文地址:https://www.cnblogs.com/Soulist/p/13769749.html
Copyright © 2011-2022 走看看