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 翻译