#P17272. [eJOI 2026] XORting

    ID: 19749 远端评测题 2000ms 1024MiB 尝试: 0 已通过: 0 显示难度普及+/提高− 上传者: 标签>贪心交互题Special JudgeeJOI(欧洲)位运算2026

[eJOI 2026] XORting

题目描述

这是一道交互题。

Iliyan 对 Jonas 开了一个恶作剧:他藏起了整数 00 到 N−1N-1 的一个排列 p0,p1,…,pN−1p_0,p_1,\ldots,p_{N-1}。Jonas 很想恢复这个排列,而你答应帮助他。

Iliyan 不会直接公布排列,但同意回答如下问题:你可以选择满足 0≤i,j<N0\le i,j<N 的两个下标 ii 和 jj,他会告诉你 pip_i 与 pjp_j 的按位异或值。

两个数的按位异或记为 ⊕\oplus,它会对每一对对应的二进制位执行逻辑异或。恰有一个输入位为 11 时,结果位为 11;否则结果位为 00。例如,75⊕29=8675\oplus 29=86,因为 1001011(2)⊕0011101(2)=1010110(2)1001011_{(2)}\oplus 0011101_{(2)}=1010110_{(2)}。在 C++ 中,a 与 b 的异或写作 a ^ b。

Iliyan 最多愿意回答 QQ 个问题。

然而,这些问题不一定能唯一确定隐藏排列。若对于每对满足 0≤i,j<N0\le i,j<N 的下标,都有 ai⊕aj=pi⊕pja_i\oplus a_j=p_i\oplus p_j,则称排列 a0,a1,…,aN−1a_0,a_1,\ldots,a_{N-1} 与 pp 不可区分。无论隐藏排列是 pp 还是 aa,Iliyan 给出的所有回答都完全相同,因此任何询问序列都无法区分二者。pp 总是与自身不可区分,也可能不存在其他与它不可区分的排列。

你的任务是求出与 pp 不可区分的字典序最小排列。

若在排列 x0,x1,…,xN−1x_0,x_1,\ldots,x_{N-1} 与 y0,y1,…,yN−1y_0,y_1,\ldots,y_{N-1} 第一个不同的位置 kk 上有 xk<ykx_k<y_k,则称 xx 的字典序小于 yy。例如,[2,0,1,4,3][2,0,1,4,3] 的字典序小于 [2,0,3,1,4][2,0,3,1,4],因为它们第一个不同的位置是 k=2k=2,且 1<31<3。

隐藏排列在程序开始前便已固定,不会根据你的询问发生改变。

实现细节

你需要实现以下函数:

std::vector<int> solve(int N)
  • NN:排列的元素个数。

该函数恰好调用 TT 次,每个隐藏排列调用一次。它必须返回与本次调用所隐藏排列不可区分的字典序最小排列。

你可以调用以下函数与评测器通信:

int get_xor(int i, int j)

每次调用返回 pi⊕pjp_i\oplus p_j。两个参数都必须是合法下标,否则程序会得到 Output isn't correct: Invalid argument。该函数会在 O(1)O(1) 时间内返回。

QQ 的值由子任务固定,不会传给你的程序。

输入格式

输入格式:

  • 第 11 行:两个整数 TT 和 QtypeQ_{\mathrm{type}},其中 QtypeQ_{\mathrm{type}} 为 11 或 22;
  • 接下来的 2T2T 行描述各个测试:
    • 第 2i2i 行:一个整数 NiN_i;
    • 第 2i+12i+1 行:NiN_i 个整数 p0,p1,…,pNi−1p_0,p_1,\ldots,p_{N_i-1}。

若 Qtype=1Q_{\mathrm{type}}=1,则 Qi=NiQ_i=N_i;若 Qtype=2Q_{\mathrm{type}}=2,则 Qi=Ni2Q_i=N_i^2。

输出格式

输出格式:

  • 第 ii 行:程序在第 ii 个测试中返回的排列。

提示

样例

考虑如下交互,其中 solve 被调用两次:

选手程序 评测程序
solve(4)
get_xor(0, 1) 返回 2
get_xor(0, 2) 返回 3
get_xor(0, 3) 返回 1
get_xor(1, 2)
get_xor(1, 3) 返回 3
get_xor(2, 3) 返回 2
return {0, 2, 3, 1}
solve(1)
return {0}

第一次调用解释

隐藏排列为 [2,0,1,3][2,0,1,3],但与它不可区分的字典序最小排列为 [0,2,3,1][0,2,3,1]。本次调用中 N1=4N_1=4,共询问 66 次;由于该子任务中 Q1=N12=16Q_1=N_1^2=16,因此询问次数合法。

第二次调用解释

当 N2=1N_2=1 时,唯一可能的排列为 [0][0]。

限制

  • 对每个 1≤i≤T1\le i\le T,均有 1≤Ni≤2201\le N_i\le 2^{20},其中 NiN_i 是第 ii 次调用 solve 时的 NN
  • 1≤T≤2101\le T\le 2^{10}
  • T⋅max⁡(N1,N2,…,NT)≤225T\cdot\max(N_1,N_2,\ldots,N_T)\le 2^{25}
  • 第 ii 次调用 solve 时,最多可询问 QiQ_i 次;根据子任务不同,QiQ_i 为 NiN_i 或 Ni2N_i^2

子任务

子任务 分值 NiN_i TT QiQ_i 附加限制
0 - Ni2N_i^2 样例。
1 7 ≤23\le 2^3 2102^{10} -
2 18 ≤27\le 2^7 252^5
3 5 ≤211\le 2^{11}
4 NiN_i
5 ≤218\le 2^{18} 对某个整数 kk,有 Ni=2kN_i=2^k。
6 NiN_i 为奇数。
7 30 -
8 25 ≤220\le 2^{20}