luogu#P8119. 「Wdoi-1.5」幻想乡游览计划

「Wdoi-1.5」幻想乡游览计划

题目背景

(此为背景,可以跳过)

自从姬虫百百世开挖了妖怪之山山顶的虹龙洞后,一成不变的幻想乡又多了可以探索的地方。充满心机的、监视着幻想乡一切动静的八云紫自然需要对其内部了如指掌,以此来掌握对幻想乡的绝对控制权。作为八云紫的式神的八云蓝,则奉命探索这块区域。随行的还有八云蓝的式神,橙。

虹龙洞开采的目的是为了获取其中的龙珠,而龙珠分布在虹龙洞内的各个角落。为了能够滴水不漏地得到更多的龙珠,百百世挖出了纵横交错的矿道,连接着各处的龙珠采集点。矿道之间相互交错,构成了一张层层叠叠的网。八云蓝和橙的任务则是分别到达过虹龙洞内所有的龙珠采集点,采集足够多的信息,以完成八云紫对虹龙洞彻底的监控目标。

然而,身处于黑暗的洞穴内,诺大的虹龙洞的环境十分险恶。极度缺氧的环境使得探索虹龙洞并不是一件容易的事情,因此八云蓝与橙不可能在虹龙洞内探索过长的时间。所幸的是,八云蓝可以联系到八云紫;而拥有操控境界能力的紫,则可以利用隙间交换蓝和橙的位置。

八云紫已经私通菅牧典从大天狗那里得到了虹龙洞的内部结构图。为了尽量减少在虹龙洞内滞留的时间,八云一家需要设计出一套可行的方案。

题目描述

虹龙洞内可以抽象成一张有 nn 个点和 mm 条的无向连通图,图可能有自环和重边。

紫会用隙间的能力,将蓝和橙传送到虹龙洞的某一结点上。此处使用隙间所花费的时间忽略不计。输出格式中的 SS 即代表初始传送到的结点。

接下来橙和蓝将会分别进行移动。每单位时间,蓝或者橙可以移动到与她们所在结点直接相连的结点上,或者紫使用隙间能力交换蓝和橙的位置。请注意:在这一单位时间内只有一个人(蓝或者橙或者紫)可以行动,并且此处的交换操作也是花费时间的。

现在,八云蓝请你构造出一个方案,使得橙和蓝各自都能经过虹龙洞的每个结点至少 11 次,并且最后回到一开始所在的结点 SS 以结束此次游览。在「输出格式」中蓝说明了构造方案的格式,你只要按格式输出构造方案告诉蓝就行了。

输入格式

第一行两个整数 n,mn,m,表示该图有 nn 个节点,mm 条边。

接下来 mm 行,每行两个整数 u,vu,v,表示有一条连接 u,vu,v 的无向边。

输出格式

第一行输出两个整数 SSkk。其中 SS 的含义见题目描述,kk 表示你的方案的操作次数。

接下来 kk 行,你可以输出三种操作中的一种指导八云一家行动:

  • 输出 Ran u,表示让蓝移动到结点 uu
  • 输出 Chen u,表示让橙移动到结点 uu
  • 输出 Swap 表示让紫交换橙和蓝的位置。

你需要保证你的构造方案合法。

容易发现,你的操作次数 kk 等于进行所有操作所花费的单位时间数。

3 3
1 2
2 3
1 3
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。

对于每组数据,若你输出的方案不合法(含不合法的移动操作,或者蓝或橙没有经过每个结点至少 11 次,或者最后蓝和橙没有在 SS 点),你的分数为零分。否则你的分数将这样计算:

  • k4nk \leq 4\cdot n 时,你将获得该测试点 20%20\% 的分数;
  • k3nk \leq 3\cdot n 时,你将获得该测试点 40%40\% 的分数;
  • k114nk \le \lfloor\frac{11}{4} \cdot n\rfloor 时,你将获得该测试点 70%70\% 的分数;
  • k83nk \le \lfloor\frac{8}{3} \cdot n\rfloor 时,你将获得该测试点所有的分数。

数据范围

本题采用捆绑测试,且仅有一个 subtask,总成绩取各测试点最低分。

对于 100%100\% 的数据,3n,m5×1053\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,表示进行到第 xx 个操作时不合法。
  2. B x,表示操作执行完毕后蓝/橙没有经过每个节点至少一次,其中 x=0x=0 表示蓝,x=1x=1 表示橙。
  3. C x,表示操作执行完毕后蓝/橙没有回到 SS 点。其中 x=0x=0 表示蓝,x=1x=1 表示橙。
  4. Illeagl Output,表示你输出了错误的操作。

若你的方案正确,校验器会给出 OK

保证在输入正确、方案合法的情况下 checker 的运行时间小于 1s。