QOJ.ac

QOJ

Time Limit: 2 s Memory Limit: 1024 MB Total points: 10

#8406. 炼金术士拜塔扎尔 [B]

Statistics

Bajtazar 是一位著名的炼金术士,他暂时搁置了制造贤者之石的尝试,转而研究物质的嬗变。更确切地说,Bajtazar 希望将一个分子转化为另一个分子。

Bajtazar 拥有的分子由 $n$ 个拜顿原子(bajtonium)组成,编号从 $1$ 到 $n$。某些原子对之间可能存在化学键,每对原子之间最多只能存在一个化学键。Bajtazar 的分子是一个连通整体——从任何一个原子出发,通过一个或多个化学键,都可以到达其他任何原子。

Bajtazar 拥有他想要得到的 $n$ 原子分子的化学键描述——对于每一对原子,他都知道它们最终是否应该通过化学键连接。目标分子满足相同的条件——它是一个连通整体,且每对原子之间最多通过一个化学键连接。遗憾的是,Bajtazar 当前的分子可能与目标分子不同。为了解决这个问题,他可以利用自己的炼金术能力。在任何时候,他都可以执行以下两种操作之一:

  • Bajtazar 可以选择两个尚未通过化学键连接的不同原子 $a$ 和 $b$,并在它们之间建立一个化学键。由于拜顿原子的极度不稳定,只有当存在一个同时与 $a$ 和 $b$ 均有化学键连接的原子 $c$($c \neq a, b$)时,他才能执行此操作。
  • Bajtazar 可以选择两个通过化学键连接的不同原子 $a$ 和 $b$,并移除它们之间的化学键。出于同样的原因,只有当存在一个同时与 $a$ 和 $b$ 均有化学键连接的原子 $c$($c \neq a, b$)时,他才能执行此操作。

Bajtazar 不想在转化上花费太多时间。请编写一个程序,帮助他将当前分子转化为目标分子,且操作次数不超过 $200\,000$ 次。

输入格式

第一行包含一个整数 $n$ ($2 \le n \le 30\,000$),表示 Bajtazar 当前分子以及目标分子中的原子数量。

第二行包含一个整数 $m_s$ ($n-1 \le m_s \le 50\,000$),表示 Bajtazar 当前分子中的化学键数量。

接下来的 $m_s$ 行,每行包含两个整数 $a_i$ 和 $b_i$ ($1 \le a_i, b_i \le n; a_i \neq b_i$),表示通过化学键连接的原子编号。保证 Bajtazar 的分子是一个连通整体,且每对原子之间最多通过一个化学键连接。

下一行包含一个整数 $m_d$ ($n-1 \le m_d \le 50\,000$),表示目标分子中的化学键数量。

接下来的 $m_d$ 行,格式与初始分子相同,描述了目标分子中的化学键。

输出格式

第一行应输出你想要执行的操作次数 $r$。必须满足 $0 \le r \le 200\,000$。

在接下来的 $r$ 行中,每行应包含一个操作的描述。如果你想在第 $i$ 次操作中连接原子 $x_i$ 和 $y_i$,则该行应以字符 + 开头,后跟一个空格,再跟上由空格分隔的原子编号 $x_i$ 和 $y_i$。如果你想移除连接原子 $x_i$ 和 $y_i$ 的化学键,则该行应以字符 - 开头,后跟一个空格,再跟上由空格分隔的原子编号 $x_i$ 和 $y_i$。

你输出的操作序列必须满足题目中的假设——在选择原子 $x_i$ 和 $y_i$ 时,必须存在另一个同时与它们连接的原子。在执行完操作序列后,最终分子必须与目标分子完全相同:对于每一对原子 $i, j$ ($1 \le i < j \le n$),当且仅当它们在目标分子中通过化学键连接时,它们在最终分子中才应通过化学键连接。

请注意,你不需要最小化操作次数——只需确保操作次数不超过 $200\,000$ 即可。可以证明,通过不超过 $200\,000$ 次操作,总是可以完成转化。

样例

输入 1

4
3
1 2
3 4
3 2
4
1 4
1 2
2 3
3 4

输出 1

3
+ 1 3
+ 1 4
- 3 1

说明 1

注意,Bajtazar 不能直接连接第一个原子和第四个原子,因为当时不存在同时与它们连接的原子。通过在第一个原子和第三个原子之间建立临时化学键,他使得第三个原子成为了那个中间原子。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.