luogu#P11067. 【MX-X4-T7】「Jason-1」Ball

【MX-X4-T7】「Jason-1」Ball

题目描述

这是一道提交答案题。

你有 1010 个盒子,每个任务会给出一个 nn,初始时前 nn 个盒子内可能有一些球,后 10n10-n 个盒子为空。

用小写字母表示每种颜色的球,初始时最多只有三种颜色的球,分别用 a,b,c\tt a, b, c 表示。而在程序中,你可以使用任何小写字母表示对应颜色的球。

定义一个盒子包含一个字符串,表示对于每种颜色的球,盒子中出现的个数不小于字符串中出现的个数。

从一个盒子中删除一个字符串,表示对于字符串中每一个小写字母代表的球,从盒子中取走一个相同颜色的球。删除的前提是需要满足此盒子包含该字符串。

向一个盒子中放入一个字符串,表示对于字符串中每一个小写字母代表的每个球,向盒子中放入一个相同颜色的球。

你需要写一个程序完成一些任务,程序包含下面几种语句可供使用:

  • change x s y t,其中 x,yx, y 是不超过 1010 的非负整数,s,ts, t 是仅由小写字母或单个字符 @ 组成的非空字符串(如果为 @ 则表示将该字符串视作空串)。如果 xx00,则将 kk11 遍历到 1010,否则 k=xk = x。如果盒子 kk 中包含字符串 ss,从其中删除 ss,并在盒子 yy 中放入字符串 tt,如果 y=0y=0 则在当前的 kk 中(原地)放入,这样就视为成功执行命令。每当成功执行命令后,立刻回到上一个断点,无论 kk 是否完全遍历。如果没有成功执行命令,跳转到下一条语句。
  • # 表示一个断点。你必须以一行断点结束整个程序。认为第 00 行也是一个断点,此断点不计入代价。

语句数可简单地视为程序中 change# 的数量之和,第 00 行的虚拟断点不计入,最后一行的断点计入。

断点数可简单地视为程序中 # 的数量。第 00 行的虚拟断点不计入,最后一行的断点计入。

你不能使用超过 100100 条语句,超过 1010 的盒子或是非小写字母的球,任意一个盒子中某种颜色的球的个数均不能超过 10810^{8},程序中的单个字符串长度不能超过 200200,你的程序单组数据实际遍历的语句条数不能超过 4×1054 \times 10^5,单组数据实际判断包含的字符集大小之和不能超过 10710^7(参考下发的检验器)。

约定 nn 表示输入至多使用的盒子数,mxmx 表示初始时每个盒子中每种颜色球个数的最大值,maxmax 表示初始时所有盒子中球总数的最大值,sumsum 表示初始时所有盒子中球的总数。任务中未提及的盒子必须保持原状,你需要分别完成下面 1010 个任务。

  1. n=10,sum100n=10, sum \le 100,你需要将所有 a\tt a 颜色球放入盒子 11,所有 b\tt b 颜色球放入盒子 22,所有 c\tt c 颜色球放入盒子 33

  2. n=10,sum100n=10, sum \le 100,你需要将所有 a\tt a 颜色的球改为 b\tt b 颜色的球,将所有 b\tt b 颜色的球改为 c\tt c 颜色的球,将所有 c\tt c 颜色的球改为 a\tt a 颜色的球,这三个操作应同时完成。

  3. n=10,sum100n=10, sum \le 100,你需要将所有不包含 a\tt a 颜色球的盒子清空。

  4. n=10,sum100n=10, sum \le 100,你需要给所有非空的,不包含 a\tt a 颜色球的盒子放入一个 a\tt a 颜色球。

  5. n=5,sum5n=5, sum \le 5,你需要将所有球按照颜色从小到大(a<b<c{\tt a} < {\tt b} < {\tt c})依次放入盒子 11sumsum,每个盒子恰好只放一个球,初始的球不保留。

  6. n=10,sum100n=10, sum \le 100,对于每个盒子,只保留一个出现次数最多的颜色的球,如果有多种颜色出现次数最多,将其变为空集。

  7. n=10,sum100n=10, sum \le 100,对于每个盒子,只保留出现次数最多的颜色的球,如果有多种颜色出现次数最多,保留颜色最小的(a<b<c{\tt a} < {\tt b} < {\tt c})。

  8. n=1,mx10n=1, mx \le 10,记 a,b,c\tt a, b, c 颜色的球的个数为 A,B,CA, B, C,你需要对于满足 1x51 \le x \le 5 的整数 xx 使得盒子 xx 在最终恰好有 A+Bx+Cx2A+Bx+Cx^2a\tt a 颜色球,不能有其它颜色球。

  9. n=5,max10n=5, max \le 10,所有 nn 个盒子中球总数相等。将每个盒子中的球按从小到大排序,组成一个字符串,保证字符串两两不同。你需要对于每个字符串求出其字典序排名,按字典序从小到大依次将盒子改为 a,b,c,d,e\tt a, b, c, d, e

  10. n=5,max10n=5, max \le 10,你需要对 nn 个盒子求前缀和,即将前面所有盒子的球复制一份放入自己。

注:子任务按某种规则排序,与难度无关。

输入格式

该题为提交答案型试题,每个测试点对应的任务见【题目描述】。

输出格式

针对给定的 1010 个任务,你需要分别将你的程序命名为 1.out10.out,并将这 1010 个文件直接压缩为 zip 文件提交。

每个文件中需要包含若干行。

第一行一个非负整数 LL,代表你使用的语句数。

接下来 LL 行,每行一个语句。

你必须以一个断点结尾。

见附件 down.zip 中的 sample 文件夹
见附件 down.zip 中的 sample 文件夹

提示

【自定义校验器数据格式】

第一行,两个整数 T,VT, V,分别表示数据组数与评分参数。

对于接下来每组数据:

第一行,两个整数 n,mn,m,表示需要描述的输入盒子数与输出盒子数。

第二行,nn 个字符串,描述输入时前 nn 个盒子的状态。

第三行,mm 个字符串,描述输出时前 mm 个盒子的状态,你仍然需要保证其它盒子为空

同样地,使用 @ 表示空串

【自定义校验器使用方法】

checker.cpp 编译后,在命令行执行

checker [in] [out] [ans]

其中 [in] 为测试数据,[out] 为你需要测试的程序,[ans] 输入和 [in] 相同的内容。

例如你需要测试第一个样例,且你的程序名为 1.out,需先将 1.in 复制到当前目录,并执行

checker 1.in 1.out 1.in

【评分标准】

对于每个测试点,其内部会评测若干组测试数据。

若你的输出出现下列情况,那么该测试点不得分:

  • 输出与要求不符。
  • 出现无法识别或不合法的语句。
  • 某个盒子中某种颜色的球数量超过 10810^8
  • 使用超过 100100 条语句。
  • 程序中单个字符串长度超过 200200
  • 使用不在 111010 之间的盒子。
  • 使用非小写字母颜色的球。
  • 单组数据实际语句遍历次数大于 4×1054 \times 10^5
  • 单组数据实际判断包含的字符集大小之和超过 10710^7(参考下发的检验器)。

语句数可简单地视为程序中 change# 的数量之和,第 00 行的虚拟断点不计入,最后一行的断点计入。

断点数可简单地视为程序中 # 的数量。第 00 行的虚拟断点不计入,最后一行的断点计入。

一个程序的代价是你给出的断点数量乘以程序的语句数,记作 valval

否则设对应子任务的评分标准为 VV,那么你的得分为:

$$\mathrm{score}=\begin{cases}11&V>val\\\Big\lfloor\frac{10}{\exp\left(1-\frac {V}{val}\right)}\Big\rfloor&\text{otherwise.}\end{cases} $$

下面给出各个任务对应的评分标准 VV:

编号 11 22 33 44 55 66 77 88 99 1010
VV 1616 2626 88 1010 1818 2020 3030