zoukankan      html  css  js  c++  java
  • CF1168E

    题意

    给定(K)及长度为(2^K)的序列({b_i}),找到两个(0sim 2^K-1)的排列,是的按位异或后得到序列({b_i})或报告不存在。
    (Kle 12,0le b_ile 2^K-1)

    做法

    (igopluslimits_{i=0}^{2^K-1}b_i eq 0),显然无解。

    定义:令(p_ioplus q_i=a_i)

    考虑初始化两个排列为(p_i=q_i=i)
    下面通过构造,证明可以实现任选两个位置(i,j),使得(a_ioplus x ightarrow a_i,a_joplus x ightarrow a_j)

    先令(a_i=a_ioplus x,a_j=a_joplus x),但现在并不满足(a_i)的定义。

    定义( ext{fix(i,j)})为修正(p_i,q_i,p_j,q_j)使得满足(p_ioplus q_i=a_i)(q_joplus q_j=a_j)

    在修正过程中,我们始终要求(p_ioplus q_ioplus a_i=p_joplus q_joplus a_j),显然初始时是满足此条件的。

    对于修正,先找到(k),使得(p_koplus q_i=a_i),由于序列({p})是一个排列,所以一定能找到。

    • (k=i),已经满足条件,修正完毕。
    • (k=j),那么将((p_i,q_i,a_i),(p_j,q_j,a_j))修正为((p_j,q_i,a_i),(p_i,q_j,a_j)),满足条件,修正完毕
    • 否则
      ((p_k,q_k,a_k))
      ((p_i,q_i,a_i))
      ((p_j,q_j,a_j))
      将其修正为:
      ((p_i,q_j,a_k))
      ((p_k,q_i,a_i))
      ((p_j,q_k,a_j))
      现在(i)位置已满足(a)的定义,递归进行( ext{fix(k,j)})操作。

    我们下面证明这样修正的复杂度,是(O(2^K))

    证明:
    考虑修正的过程,是( ext{fix(a,j)} ightarrow ext{fix(b,j)} ightarrow cdots)
    且在对应的三元组中,有部分位置是常数:((p_i,?,?)(p_j,?,a_j))
    我们下面证明,对于( ext{fix(?,j)})的第一维,每个位置最多来一次。
    假设某个时刻,得到了这样一个状态( ext{fix(y,j)})
    ((p_k,q_k,a_k))
    ((p_i,q_x,a_y))(1)
    ((p_j,q_y,a_j))(2)
    (注意,我们暂时假设没有位置被重复遍历,所以那个(1)的(a)下标与(2)(的q)下标相同)
    交换一次变成( ext{fix(k,j)})
    ((a_i,q_y,a_k))
    ((p_k,q_x,a_y))
    ((p_j,q_k,a_j))
    在进行若干次操作后,来到状态( ext{fix(n,j)})
    ((p_k,q_x,a_y))
    ((p_i,?,a_n))
    ((p_j,q_n,a_j))
    交换一次变成( ext{fix(y,j)})
    ((p_i,q_n,a_y))(3)
    ((p_j,q_x,a_j))(4)
    由(1)(2)得到((p_ioplus q_xoplus a_y)oplus (p_joplus q_yoplus a_j)=0)
    由(3)(4)得到((p_ioplus q_noplus a_y)oplus (p_joplus q_xoplus q_j)=0)
    稍加化简,得到(q_y=q_n),由于({q})为排列,则(y=n),与事实矛盾。
    看到这里,或许你会跟我有一样的感觉,就是如果是( ext{fix(i,j)})重复遍历了会怎么样,那我们继续?
    ((p_k,q_k,a_k))
    ((p_i,q_i,a_i))
    ((p_j,q_j,a_j))
    变成
    ((p_i,q_j,a_k))
    ((p_k,q_i,a_i))(1)
    ((p_j,q_k,a_j))(2)
    经过若干次,到达这样一个状态
    ((p_k,q_i,a_i))
    ((p_i,?,a_n))
    ((p_j,q_n,a_j))
    交换变成
    ((p_i,q_n,a_i))(3)
    ((p_k,?,a_n))
    ((p_j,q_i,a_j))(4)
    然后这样问题出现了,由于({q})是个排列,显然得到(n=j),但这与事实矛盾。

    最多进行(O(2^K))次将两个位置(i,j)(a_i,a_j)同时异或上(x),便可以得到({b})
    所以总复杂度为(O(4^K))

  • 相关阅读:
    Laravel 5.1 简单学习
    Laravel5.1 报错:控制器不存在
    集电极开路、漏极开路、上拉电阻、下拉电阻等接口相关基本概念
    UDS(ISO14229-2006) 汉译(No.7 应用层协议)
    Freescale 车身控制模块(BCM) 解决方案
    汽车控制器LIMPHOME电路设计
    区分整流二极管和稳压二极管
    耦合电容和滤波电容的区别
    二极管钳位电路
    开关二极管工作原理
  • 原文地址:https://www.cnblogs.com/Grice/p/14470600.html
Copyright © 2011-2022 走看看