ccf#SXLK2024B. 魔法手杖(xor)

魔法手杖(xor)

题目描述

提示: 我们在题目描述的最后提供了一份简要的、形式化描述的题面。

C 城是一座魔力之都,以最高的魔法师水平闻名。对于一名魔法师而言,最重要的固然是魔法手杖和镶嵌在手杖上的魔法水晶。

每个魔法手杖和魔法水晶都可以用 魔力值 来衡量其能力大小,一个魔法手杖的魔力值是镶嵌在其上的所有魔法水晶中魔力值的最小值。

ω\omega 是 C 城的一名见习魔法师,他想加强他的魔法手杖。在加强之前,小 ω\omega 的魔法手杖镶嵌着 nn 颗魔法水晶,它们的魔力值分别为 a1,a2,,ana_1,a_2,\dots,a_n

ω\omega 准备使用一次强力的秘术来加强他的手杖。这一次秘术中,他可以任意选择 xx,然后将所有魔法水晶的魔力值由 aia_i 变为 (aix)(a_i \oplus x),其中 \oplus 表示按位异或。由于小 ω\omega 能力有限,a1,a2,,ana_1,a_2,\dots,a_nxx 都是 [0,2k1][0,2^k-1] 中的整数。

ω\omega 还发现这个秘术可以定向加强。具体地,他可以花费 bib_i 的体力值对第 ii 个魔法水晶进行定向加强,将原本应变为 (aix)(a_i \oplus x) 的魔力值变为 (ai+x)(a_i+x)。小 ω\omega 能力有限,因此他定向加强所花费的体力值总和不能超过 mm,且每个水晶只能被定向加强至多一次。

ω\omega 想知道他在加强魔法手杖后,魔法手杖的魔力值最大能为多少,但他并不会算,所以请你来帮他计算。

形式化的: 给定 a1,a2,,ana_1,a_2,\dots,a_n 以及 b1,b2,,bnb_1,b_2,\dots,b_n,满足 ai[0,2k1]a_i \in [0,2^k-1] 以及 bi0b_i\geq 0,你需要给出 S{1,2,,n}S \subseteq \{1,2,\dots,n\} 以及 x[0,2k1]x \in [0,2^k-1] 满足以下条件:

  • iSbim\sum \limits_{i\in S} b_i\leq m
  • 满足以上条件的前提下,最大化 $val(S,x)=\min(\min \limits_{i \in S}(a_i+x),\min \limits_{i \in U \backslash S}(a_i \oplus x))$ 的值。

你只需要给出最大的 val(S,x)val(S,x) 的值即可。

输入格式

本题有多组测试数据。 输入的第一行包含两个整数 c,Tc,T,表示测试点编号与测试数据组数。样例中的 cc 表示该样例的数据范围与第 cc 个测试点的数据范围相同。

接下来依次给出每组输入数据,对于每组数据:

  • 第一行三个整数 n,m,kn,m,k
  • 第二行 nn 个整数 a1,a2,,ana_1,a_2,\dots,a_n,分别表示每个魔法水晶的初始魔力值;
  • 第三行 nn 个整数 b1,b2,,bnb_1,b_2,\dots,b_n,分别表示每个魔法水晶定向加强需要的体力值。

输出格式

对于每组测试数据输出一行一个整数表示小 ω\omega 能获得魔法手杖魔力值的最大值。

1 2
5 2 3
1 1 2 3 7
1 1 0 3 2
1 1 1
1
0
5
2

样例 1 解释

  • 对于第一组数据,一种可行的方案为:定向强化魔法水晶 55(即 S={5}S=\{5\})并取 x=4x=4,最后得到的魔法水晶魔力值分别为 5,5,6,7,115,5,6,7,11,故魔法手杖的魔力值为 55。可以证明不存在更优方案。
  • 对于第二组数据,一种可行的方案为:定向强化魔法水晶 11(即 S={1}S=\{1\})并取 x=1x=1

样例 2

见选手目录下的 xor/xor2.inxor/xor2.ans

该组样例满足 c=4c=4

样例 3

见选手目录下的 xor/xor3.inxor/xor3.ans

该组样例满足 c=7c=7

样例 4

见选手目录下的 xor/xor4.inxor/xor4.ans

该组样例满足 c=9c=9

样例 5

见选手目录下的 xor/xor5.inxor/xor5.ans

该组样例满足 c=11c=11

样例 6

见选手目录下的 xor/xor6.inxor/xor6.ans

该组样例满足 c=14c=14

样例 7

见选手目录下的 xor/xor7.inxor/xor7.ans

该组样例满足 c=22c=22

数据范围

n\sum n 表示单组测试点各组数据 nn 的和。对于所有测试数据,

  • T1T \geq 1
  • 1n1051 \leq n \leq 10^51n5×1051 \leq \sum n \leq 5\times 10^5
  • 0m1090 \leq m \leq 10^9
  • 0k1200 \leq k \leq 120
  • 1in,0ai<2k\forall 1 \leq i \leq n, 0 \leq a_i < 2^k
  • 1in,0bi109\forall 1 \leq i \leq n, 0 \leq b_i \leq 10^9
测试点编号 n\sum n \leq nn \leq mm \leq kk \leq 特殊性质
131\sim 3 1010 10910^9 1010
464\sim 6 5×1055\times 10^5 10510^5 00 3030 A
7,87,8 22 10910^9 B
9,109,10 10510^5
111311\sim 13 C
14,1514,15 500500 10210^2
161816\sim 18 5×1045\times 10^4 10410^4 6060
192119\sim 21 3×1053\times 10^5 10510^5 120120
222522\sim 25 5×1055\times 10^5
  • 特殊性质 A:m=0m=01i<n,bi1\forall 1 \leq i < n, b_i\geq 1
  • 特殊性质 B:m=1m=11i<n,bi{1,2}\forall 1 \leq i < n, b_i \in \{1,2\},且至多只有一个 ii 满足 bi=1b_i=1
  • 特殊性质 C:m=1m=11i<n,bi{1,2}\forall 1 \leq i < n, b_i \in \{1,2\}

提示

本题输入文件较大,请使用较为快速的输入方式。

在评测环境中,你可以使用 128128 位有符号整数类型 __int128,它可以存储范围在 [2127,21271][-2^{127},2^{127}-1] 内的整数,使用方法与其他整型类型基本一致。

需要注意,此类型无法使用诸如 cin/coutscanf/printf 等常规输入输出方式进行输入输出。我们在选手目录下提供了一份 __int128 的输入输出函数实现(选手目录下的 xor/io.cpp)供选手选择使用。