CF1682D Circular Spanning Tree

题目描述

有 $n$ 个节点按顺时针顺序排列成一个圆圈,编号为 $1$ 到 $n$。你还得到一个长度为 $n$ 的二进制字符串 $s$。 你的任务是,在这 $n$ 个节点上构造一棵满足以下两个条件的树,或者报告不存在这样的树: - 对于每个节点 $i$($1 \leq i \leq n$),如果 $s_i = 0$,则该节点的度数为偶数;如果 $s_i = 1$,则该节点的度数为奇数。 - 在圆圈内部,树的任意两条边都不能有内部交点。允许边在圆周上相交。 注意,所有边都画为直线段。例如,树中的边 $(u, v)$ 画为连接圆圈上 $u$ 和 $v$ 的线段。 一棵 $n$ 个节点的树是一个连通且有 $n-1$ 条边的图。

输入格式

输入包含多组测试用例。第一行包含一个整数 $t$($1 \leq t \leq 2 \cdot 10^4$),表示测试用例的数量。接下来是每个测试用例的描述。 每个测试用例的第一行包含一个整数 $n$($2 \leq n \leq 2 \cdot 10^5$),表示节点数。 第二行包含一个长度为 $n$ 的二进制字符串 $s$。 保证所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。

输出格式

对于每个测试用例,如果不存在满足条件的树,则输出 "NO"(不带引号);否则输出 "YES",并输出该树的描述。 你可以以任意大小写输出每个字母(例如 "YES"、"Yes"、"yes"、"yEs" 都会被识别为肯定答案)。 如果存在这样的树,则输出 $n-1$ 行,每行包含两个整数 $u$ 和 $v$($1 \leq u, v \leq n, u \neq v$),表示树中的一条边。如果有多种方案,输出任意一种即可。

说明/提示

在第一个测试用例中,树如下图所示: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1682D/a3c1924547a7a2cf2e2e161bdb11c580efe3e855.png) 在第二个测试用例中,唯一可能的树是连接 $1$ 和 $2$ 的一条边,但它不满足度数限制。 在第三个测试用例中, ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1682D/e5b3e28053fdc3d6ed84005d3e46d8276c4f8576.png) 左侧的树满足度数限制,但边在圆内部有交点,因此不是合法的树;右侧的树是合法的。 由 ChatGPT 4.1 翻译