CF501C Misha and Forest
题目描述
我们定义森林为一个无向无环图(同时没有自环和重边)。有一天,Misha 玩了一块包含 $n$ 个顶点的森林。对于每个顶点 $v$,从 $0$ 到 $n-1$,他都记下了两个整数 $degree_{v}$ 和 $s_{v}$,其中第一个整数表示与顶点 $v$ 相邻的顶点数量,第二个整数表示与顶点 $v$ 相邻的所有顶点编号的异或和(如果没有相邻顶点,则写 $0$)。
第二天,Misha 忘记了他最初那张图长什么样。但他还保留着 $degree_{v}$ 和 $s_{v}$ 的数值。请你帮他找出初始图的边数和所有边。题目保证一定存在一个满足这些条件的森林。
输入格式
第一行包含一个整数 $n$($1 \leq n \leq 2^{16}$),表示图中顶点的数量。
接下来的 $n$ 行中,第 $i$ 行包含 $degree_{i}$ 和 $s_{i}$ 两个数($0 \leq degree_{i} \leq n-1$,$0 \leq s_{i} < 2^{16}$),用空格分隔。
输出格式
第一行输出一个整数 $m$,表示图中的边数。
接下来 $m$ 行,每行输出两个不同的整数 $a$ 和 $b$($0 \leq a \leq n-1$,$0 \leq b \leq n-1$),表示一条边 $(a, b)$。
边可以按任意顺序输出,边的两个端点编号的顺序也可以互换。
说明/提示
异或和是指按位对所有数字进行模 $2$ 加法的结果。许多现代编程语言均支持这种操作。例如,在 C++、Java 和 Python 中通常写作 “^”,在 Pascal 中则写作 “xor”。
由 ChatGPT 5 翻译