「Wdoi-1.5」幻想乡游览计划
题目背景
(此为背景,可以跳过)
自从姬虫百百世开挖了妖怪之山山顶的虹龙洞后,一成不变的幻想乡又多了可以探索的地方。充满心机的、监视着幻想乡一切动静的八云紫自然需要对其内部了如指掌,以此来掌握对幻想乡的绝对控制权。作为八云紫的式神的八云蓝,则奉命探索这块区域。随行的还有八云蓝的式神,橙。
虹龙洞开采的目的是为了获取其中的龙珠,而龙珠分布在虹龙洞内的各个角落。为了能够滴水不漏地得到更多的龙珠,百百世挖出了纵横交错的矿道,连接着各处的龙珠采集点。矿道之间相互交错,构成了一张层层叠叠的网。八云蓝和橙的任务则是分别到达过虹龙洞内所有的龙珠采集点,采集足够多的信息,以完成八云紫对虹龙洞彻底的监控目标。
然而,身处于黑暗的洞穴内,诺大的虹龙洞的环境十分险恶。极度缺氧的环境使得探索虹龙洞并不是一件容易的事情,因此八云蓝与橙不可能在虹龙洞内探索过长的时间。所幸的是,八云蓝可以联系到八云紫;而拥有操控境界能力的紫,则可以利用隙间交换蓝和橙的位置。
八云紫已经私通菅牧典从大天狗那里得到了虹龙洞的内部结构图。为了尽量减少在虹龙洞内滞留的时间,八云一家需要设计出一套可行的方案。
题目描述
虹龙洞内可以抽象成一张有 $n$ 个点和 $m$ 条的无向连通图,图可能有自环和重边。
紫会用隙间的能力,将蓝和橙传送到虹龙洞的某一结点上。此处使用隙间所花费的时间忽略不计。输出格式中的 $S$ 即代表初始传送到的结点。
接下来橙和蓝将会分别进行移动。每单位时间,蓝或者橙可以移动到与她们所在结点**直接相连**的结点上,或者紫使用隙间能力交换蓝和橙的位置。请注意:在这一单位时间内**只有一个人(蓝或者橙或者紫)可以行动**,并且此处的交换操作也是花费时间的。
现在,八云蓝请你构造出一个方案,使得橙和蓝**各自都**能经过虹龙洞的每个结点至少 $1$ 次,并且最后**都**回到一开始所在的结点 $S$ 以结束此次游览。在「输出格式」中蓝说明了构造方案的格式,你只要按格式输出构造方案告诉蓝就行了。
输入输出格式
输入格式
第一行两个整数 $n,m$,表示该图有 $n$ 个节点,$m$ 条边。
接下来 $m$ 行,每行两个整数 $u,v$,表示有一条连接 $u,v$ 的无向边。
输出格式
第一行输出两个整数 $S$ 和 $k$。其中 $S$ 的含义见题目描述,$k$ 表示你的方案的操作次数。
接下来 $k$ 行,你可以输出三种操作中的一种指导八云一家行动:
- 输出 `Ran u`,表示让蓝移动到结点 $u$;
- 输出 `Chen u`,表示让橙移动到结点 $u$;
- 输出 `Swap` 表示让紫交换橙和蓝的位置。
你需要保证你的构造方案合法。
容易发现,你的操作次数 $k$ 等于进行所有操作所花费的单位时间数。
输入输出样例
输入样例 #1
3 3
1 2
2 3
1 3
输出样例 #1
1 5
Ran 2
Chen 3
Swap
Ran 1
Chen 1
说明
### 样例解释
$$
\def\arraystretch{1.5}
\begin{array}{|c|c|c|}\hline
\textbf{操作次数} & \textbf{蓝的位置} &\textbf{橙的位置} \cr\hline
0 & 1 & 1 \cr\hline
1 & 2 & 1 \cr\hline
2 & 2 & 3 \cr\hline
3 & 3 & 2 \cr\hline
4 & 1 & 2 \cr\hline
5 & 1 & 1 \cr\hline
\end{array}
$$
### 判分方式
**本题使用 Special Judge。**
对于每组数据,若你输出的方案不合法(含不合法的移动操作,或者蓝或橙没有经过每个结点至少 $1$ 次,或者最后蓝和橙没有在 $S$ 点),你的分数为零分。否则你的分数将这样计算:
- 当 $k \leq 4\cdot n$ 时,你将获得该测试点 $20\%$ 的分数;
- 当 $k \leq 3\cdot n$ 时,你将获得该测试点 $40\%$ 的分数;
- 当 $k \le \lfloor\frac{11}{4} \cdot n\rfloor$ 时,你将获得该测试点 $70\%$ 的分数;
- 当 $k \le \lfloor\frac{8}{3} \cdot n\rfloor$ 时,你将获得该测试点所有的分数。
### 数据范围
**本题采用捆绑测试,且仅有一个 subtask,总成绩取各测试点最低分。**
对于 $100\%$ 的数据,$3\leq n,m \leq 5\times 10^5$。
### 校验器
为了方便选手测试,在附件中我们下发了 `checker.cpp` 文件,选手可以编译该程序,并使用它校验自己的输出文件。但请注意它与最终评测时所使用的校验器并不完全一致。你也不需要关心其代码的具体内容。
编译命令为:`g++ checker.cpp −o checker -std=c++14`。
checker 的使用方式为:`./checker <inputfile> <outputfile>`,参数依次表示输入文件与你的输出文件。
若你输出的数字大小范围不合法,则校验器会给出相应提示。若你的输出数字大小范围正确,但方案错误,则校验器会给出简要的错误信息:
1. `A x`,表示进行到第 $x$ 个操作时不合法。
2. `B x`,表示操作执行完毕后蓝/橙没有经过每个节点至少一次,其中 $x=0$ 表示蓝,$x=1$ 表示橙。
3. `C x`,表示操作执行完毕后蓝/橙没有回到 $S$ 点。其中 $x=0$ 表示蓝,$x=1$ 表示橙。
4. `Illeagl Output`,表示你输出了错误的操作。
若你的方案正确,校验器会给出 `OK`。
保证在输入正确、方案合法的情况下 checker 的运行时间小于 1s。