CF925C

题意

对于一个数组A,通过一个变换为B数组:
(B_1=A_1)(B_i=A_ioplus A_{i-1}(iin(1,n]))
现在给定一个B数组,但其已经被打乱了,能否将其重排列满足逆变换后A数组递增

做法

假设B数组已经重排列好了,即(A_k=igopluslimits_{i=1}^k B_i),满足A数组递增即为(forall kin[1,n),igopluslimits_{i=1}^k B_i<igopluslimits_{i=1}^{k+1}B_i)
满足其的充要条件为(forall kin[1,n),B_{k+1})最高位对应在(igopluslimits_{i=1}^k B_i)(0)

先给出一个做法,后面再说正确性
令集合(S_i)(B_k)最高位为(i)的元素集合
考虑一个一个元素排列,令(sum)为已经确定的前缀异或和,然后(i=1sim logV)贪心找(S_i)是否合法,若合法随意取一个元素加入排列,然后从(S_i)中移除

正确性:
若有满足条件的重排列(B),可以通过调整成贪心的排列

原文地址:https://www.cnblogs.com/Grice/p/12996591.html