CF1423I Lookup Tables
题目描述
John 有 $Q$ 个闭区间 $[l_i, r_i]$,区间中是连续的 $2K$ 位数字,每个区间对应一个 16 位的数值 $v_i$($0 \leq i < Q$)。
John 希望实现一个函数 $F$,这个函数将 $2K$ 位的数字映射为 16 位数字,使得每个区间内的所有输入都能映射到该区间的值。具体来说,对于每一个 $0 \leq i < Q$ 和每个 $x \in [l_i, r_i]$,都有 $F(x) = v_i$。对于不在任何区间中的输入,$F(x)$ 的输出无需关心。
为提高函数 $F$ 的实现效率,John 决定使用查找表。但考虑到一个完整的 $2K$ 位查找表太大,无法放入内存,他计划使用两个 $K$ 位的查找表,分别是 LSBTable 和 MSBTable。具体实现方式为:
$$ F(x) = \textrm{LSBTable}[\textrm{lowKBits}(x)] \; \& \; \textrm{MSBTable}[\textrm{highKBits}(x)] $$
即,返回在 LSBTable 中查找 $x$ 的低 $K$ 位和在 MSBTable 中查找 $x$ 的高 $K$ 位的结果,并进行位与运算。
John 需要你的帮助。已知 $K$ 和 $Q$ 以及 $Q$ 个区间 $[l_i, r_i]$ 和对应的值 $v_i$,你需要找到一对查找表 LSBTable 和 MSBTable 来实现函数 $F$,或者告知无法实现。
输入格式
第一行包含两个整数 $K$ 和 $Q$,分别表示位数和区间个数($1 \leq K \leq 16$,$1 \leq Q \leq 2 \cdot 10^5$)。
接下来的 $Q$ 行,每行包含三个整数 $l_i$、$r_i$ 和 $v_i$,表示区间范围和对应的值($0 \leq l_i \leq r_i < 2^{2K}$,$0 \leq v_i < 2^{16}$)。
输出格式
如果存在符合要求的查找表,输出第一行应为“possible”(不包含引号),否则输出“impossible”(不包含引号)。
如果有解,接下来的 $2 \cdot 2^K$ 行中输出计算出的 LSBTable 和 MSBTable 的所有值。如果解不唯一,可以输出任意满足条件的解。
第 $1 + i$ 行输出 $\textrm{LSBTable}[i]$($0 \leq i < 2^K$,$0 \leq \textrm{LSBTable}[i] < 2^{16}$)。
第 $1 + 2^K + i$ 行输出 $\textrm{MSBTable}[i]$($0 \leq i < 2^K$,$0 \leq \textrm{MSBTable}[i] < 2^{16}$)。
说明/提示
闭区间 $[a, b]$ 包含 $a$ 和 $b$。
在第一个样例中,LSBTable 为 $[1, 3]$,MSBTable 为 $[1, 3]$ 时满足条件:$F[0] = 1 \& 1 = 1$,$F[1] = 3 \& 1 = 1$,$F[2] = 1 \& 3 = 1$,$F[3] = 3 \& 3 = 3$。
在第二个样例中,LSBTable 为 $[3, 3, 2, 2]$,MSBTable 为 $[0, 3, 0, 1]$ 时满足所有条件。
在第三个样例中,无法找到两个查找表满足要求。
**本翻译由 AI 自动生成**