E: Lost Array
题目翻译
给你 n 个数,分别是a1,a2,a3,⋯,an,目的是计算这 n 个数的异或的值。你可以通过询问 k 个数的方式,来获得任意 k 个数的异或值。
- 如果无法求得 n 个数的异或值,输出
-1
。
- 如果可以求得 n 个数的异或值,需要使用最少的询问次数。输出 n 个数的异或值。
数据范围:n∈[1,500],k∈[1,n],ai∈[1,109]。
题目思路
首先判断是否能求得这 n 个数的异或值,如果能够求得,就计算出询问次数。
这里抽象一下题意,理解为一个位置移动问题。刚开始在座标轴起点 0, 每次可以向左或者右移动共 k 位,但是不能走到比 0 小的位置,也不能走到大于 n 的位置,问能不能到达 n 。位置移动的所在位置相当于当前已经询问之后的异或的数的值。移动中向左移动 Lk 位,向右边移动 Rk 位,Lk+Rk=k,这相当于取的 k 个数中,有 Lk 个数是之前选择过的,异或之后需要将它移出,有 Rk 个数是之前没有选择过的,异或之后,需要将他们添加到选择的列表中。这样的问题,可以用BFS解决。每次移动可以向左移动 i(0≤i≤k),那么就会向右移动 k−i 位。如果发现到不了 n,就表示到不了目的地。
参考代码