#CCSP2019D. 摘水果
摘水果
时间限制: 1.0 秒
空间限制: 512 MB
题目背景
在我的后园,可以看见墙外有两株树。
——鲁迅,《野草》
题目描述
在我的后园,可以看见墙外有两株树,一株是苹果树,还有一株是梨树。收获的季节到了,两棵树上分别结了 个果子;苹果树的果子用 1 到 的整数编号,而梨树的果子用 到 的整数编号。我们为每个果子评出了美味度,编号为 的果子美味度为 。
对于编号为 的果子,我们给出 ,表示仅当 号果子被摘下后, 号果子才能被摘下(如果 ,表示这个果子不产生限制)。如果某个果子被多条限制所影响,那么必须等到所有的条件都满足时才能被摘下;而没受到限制的果子总能被摘下。另外,我们对所有 保证 ,并且要么 果子与 号果子在同一棵树上,要么 。这样,我们总有办法按照某种顺序摘下两棵树上的所有果子,不会发生由于限制而无法摘下某些果子的情况。
现在我们要将这些果子包装并出售:每次,我们都从苹果树与梨树上分别摘下一个果子,然后将其作为一包出售,其价值是两个果子的美味度的按位异或的结果。这个过程会重复 次,直到所有的果子都被摘完。每次,我们会按照以下标准选择摘取的果子:
- 需要优先最大化两个果子作为一包时的价值;
- 如果有多种方式使得价值最大,则要在此基础上最大化苹果的美味度;
- 如果仍有平局,则要在此基础上最大化苹果的编号;
- 如果仍有平局,则要在此基础上最大化梨的编号(此时不可能再出现平局了)。
你需要依次给出每一包果子的价值。
输入格式
从标准输入读入数据。
第一行输入一个正整数 。
第二行依次输入 个非负整数 。
第三行依次输入 个非负整数 。
同一行相邻的两个数之间用一个空格隔开。
输出格式
输出到标准输出。
输出一行,包含 个数,依次表示每一包果子的价值。
同一行相邻的两个数之间用一个空格隔开。
3
3 9 4 1 3 4
0 0 2 0 4 4
7 13 2
样例 1 解释
仅有 3 号果子被摘下后,才能摘下 2 号果子;仅有 5 号果子与 6 号果子均被摘下后,才能摘下 4 号果子。
第 1 次,摘下了编号为 3、美味度为 4 的苹果与编号为 5、美味度为 3 的梨,得到了价值为 7(3 与 4 异或)的一包果子。注意,假设选取编号为 1 的苹果与编号为 6 的梨,虽然价值同样为 7,但由于苹果的美味度不如前述方案,所以不这样选择。
第 2 次,摘下了编号为 2、美味度为 9 的苹果与编号为 6、美味度为 4 的梨,得到了价值为 13(9 与 4 异或)的一包果子。
第 3 次,摘下了编号为 1、美味度为 3 的苹果与编号为 4、美味度为 1 的梨,得到了价值为 2(3 与 1异或)的一包果子。
子任务
所有数据保证 $n \leq 100,~0 \leq a_1, a_2, \dots, a_{2n} \leq 100$。
本题采用捆绑测试,你只有通过一个子任务中的所有测试点才能得到该子任务的分数。
- 子任务 1(31 分):对 的 满足 ,而 ,这意味着任意时刻任何一棵树只有一个可以摘的果子;
- 子任务 2(47 分):对任意的 满足 ,这意味着所有果子都没有受到任何的限制;
- 子任务 3(22 分):无特殊限制。