Note: Currently the partial scoring for this problem is not working.
怪物城有一个大型公园,该公园由若干个景点以及连接这些景点所在地点的单向道路组成,共有 $v$ 个景点,编号为 $1,2,\cdots,v$,这些景点包含了 $n$ 个入口和 $1$ 个出口,编号 $1,2,\cdots,n$ 的景点为入口,编号为 $v$ 的景点为出口。公园内一共有 $e$ 条道路,第 $i$ 条道路的起点为景点 $a_i$,终点为景点 $b_i$。
每个景点 $i$ 都有一个标志 $s_i$,这个标志是 &
、|
两者之一。类似地,每条道路 $i$ 也有一个标志 $t_i$,这个标志是 &
、|
、~
、<
、>
五者之一。如果 $t_i$ 不等于 ~
,那么道路 $i$ 还有一个权值 $l_i$。
每天,有 $n$ 只怪物组成一波进入公园。第 $i$ 天,初始生命值分别为 $h_{i,1},h_{i,2},\cdots,h_{i,n}$ 的 $n$ 只怪物在同一时刻分别进入 $n$ 个入口 $1,2,\cdots,n$,然后这些怪物将在公园内闯荡。在每一分钟内,每只怪物将会分身成 $k$ 个生命值和分身前相同的怪物($k$ 为以该怪物所在景点为起点的道路数),分别朝着 $k$ 条以该怪物所在景点为起点的道路前进。
一只怪物通过一条道路恰好需要 $1$ 分钟。生命值为 $h$ 的怪物通过道路 $i$ 之后生命值将变化为 $h'$,下表给出了变化关系。
$t_i=$ | $h'=$ | 说明 |
---|---|---|
& |
$h\ \mathrm{AND}\ l_i$ | 将 $h$ 和 $l_i$ 在二进制下做按位与运算的结果 |
| |
$h\ \mathrm{OR}\ l_i$ | 将 $h$ 和 $l_i$ 在二进制下做按位或运算的结果 |
~ |
$\mathrm{NOT}\ h$ | 将 $h$ 在二进制下按位 $0,1$ 取反的结果 |
< |
$h\ \mathrm{SHL}\ l_i$ | 将 $h$ 在二进制下低位补 $l_i$ 个 $0$,舍弃最高 $l_i$ 位的结果 |
> |
$h\ \mathrm{SHR}\ l_i$ | 将 $h$ 在二进制下高位补 $l_i$ 个 $0$,舍弃最低 $l_i$ 位的结果 |
表格中 $\mathrm{AND},\mathrm{OR},\mathrm{NOT},\mathrm{SHL},\mathrm{SHR}$ 分别对应了按位与、按位或、按位取反、按位左移、按位右移五种位运算。其中 $h,l_i$ 和 $h'$ 都是 $32$ 位无符号整数。对于 $\mathrm{AND},\mathrm{OR}$ 运算,满足 $0\le l_i < 2^{32}$。对于 $\mathrm{SHL},\mathrm{SHR}$ 运算,满足 $0\le l_i < 32$。
当生命值为 $h_1,h_2,\cdots,h_c$ 的多只怪物在同一景点 $i$ 相遇时,它们会合体成一只怪物,其生命值 $h'$ 等于 $h_1,h_2,\cdots,h_c$ 做 $s_i$ 运算的结果,即:若 $s_i$ 为 &
,则合体后的怪物生命值 $h'=h_1\ \mathrm{AND}\ h_2\ \mathrm{AND}\ \cdots\ \mathrm{AND}\ h_c$;若 $s_i$ 为 |
,则合体后的怪物生命值 $h'=h_1\ \mathrm{OR}\ h_2\ \mathrm{OR}\ \cdots\ \mathrm{OR}\ h_c$。之后,如果该怪物位于公园的出口,那么它就会离开公园。每一波怪物中,第一只离开公园的怪物被称为 Winner。所有怪物初始生命值和 Winner 离开公园时的生命值都会被记录下来。
一只怪物死亡当且仅当以下几种情况之一(死亡后的怪物永远不会行动或参与合体):
1、没有一条道路以该怪物所在景点为起点,且该怪物不在出口。
2、该怪物的生命值为 $0$。这意味着怪物可能在道路上死亡或者在合体后瞬间死亡。
3、从所有怪物进入公园到当前时刻超过了 $k$ 分钟,其中 $k$ 为怪物的寿命。
你可以认为第 $i+1$ 天时,在第 $i$ 天进入的怪物均离开公园或死亡。
然而,$m$ 天之后,一场天灾将这个公园严重破坏了。不过,怪物城希望根据这 $m$ 天的记录重建这个公园,但这件事有些困难,于是他找到了你来帮忙——当然,只要你设计出任意一种能满足 $m$ 天的所有记录的方案就行了。
输入格式
所有输入数据 rebuild1.in ~ rebuild10.in 见数据下载。
输入第 $1$ 行包含 $3$ 个整数 $n,m,k$,分别表示每天进入的怪物个数、天数以及怪物的寿命。
第 $2$ 行至第 $2m+1$ 行为 $m$ 天的记录。其中,第 $2i$ 行包含 $n$ 个整数 $h_{i,1},h_{i,2},\cdots,h_{i,n}$,表示第 $i$ 天的 $n$ 只怪物进入公园时的初始生命值,第 $2i+1$ 行包含 $1$ 个整数 $w_i$,表示第 $i$ 天怪物的 Winner 离开公园时的生命值。数据保证每天均存在 Winner。
输出格式
针对给定的 $10$ 个输入文件 rebuild1.in ~ rebuild10.in,你需要分别提交你的输出文件 rebuild1.out ~ rebuild10.out。
输出第 $1$ 行包含 $2$ 个整数 $v,e$,分别表示景点数和道路数,$n < v\le 100$,$0\le e\le 500$。
第 $2$ 行包含 $1$ 个长度为 $v$ 的字符串 $s$,其中第 $i$ 个字符 $s_i$ 为 &
、|
之一,表示第 $i$ 个景点的标志。
第 $3$ 行至第 $e+2$ 行,每行描述一条道路。其中,第 $i+2$ 行四个数或字符 $a_i,b_i,t_i,l_i$,分别表示第 $i$ 条道路的起点、终点、标志和权值。$1\le a_i,b_i\le v$,标志为 &
、|
、~
、<
、>
之一,特别地,当 $t_i$ 为 ~
时,$l_i$ 并不会输入。允许两景点间连有多条道路,也允许存在起点和终点相同的道路。
输出任意一种满足要求的方案即可。数据保证存在这样的方案。
样例输入
2 4 2 11 1 20 11 2 18 11 3 16 18 12 12
样例输出
4 4 ||&& 1 3 | 0 2 3 ~ 2 4 & 12 3 4 < 1
样例说明
样例输出为一种可能的公园重建方案。以第 $1$ 天的怪物为例:
一开始,有 $2$ 只怪物,分别位于景点 $1,2$,生命值分别为 $11,1$。
第 $1$ 分钟,景点 $1$ 的怪物沿道路进入景点 $3$,其生命值变为 $11\ \mathrm{OR}\ 0=11$;景点 $2$ 的怪物分身成 $2$ 只怪物,一只沿道路进入景点 $3$,其生命值变为 $\mathrm{NOT}\ 1=4294967294$,另一只沿道路进入景点 $4$,其生命值变为 $1\ \mathrm{AND}\ 12=0$,因此该分身在进入景点前死亡。之后,位于景点 $3$ 的 $2$ 只怪物合体成 $1$ 只生命值为 $11\ \mathrm{AND}\ 4294967294=10$ 的怪物。此时仅景点 $3$ 有 $1$ 只怪物。
第 $2$ 分钟,景点 $3$ 的怪物沿道路进入景点 $4$,其生命值变为 $10\ \mathrm{SHL}\ 1=20$。景点 $4$ 为出口,所以接下来该怪物将离开公园,成为 Winner。
因此,该组怪物的 Winner 生命值为 $20$。
子任务及部分分
我们提供了 $10$ 个评分文件 rebuild1.ans ~ rebuild10.ans。每个评分文件共 $10$ 行,第 $i$ 行一个评分参数 $a_i$,具体意义将在下面给出。
每个测试点单独评分。对于每个测试点,如果选手的输出格式不合法,则得 $0$ 分。如果输出合法,但 $m$ 条记录中只有部分记录被满足,则你还可能获得部分分。
在你的方案中,若满足的记录条数为 $x_{user}$,你的分数将会由下表给出:
得分 | 条件 | 得分 | 条件 |
---|---|---|---|
$10$ | $x_{user}\ge a_{10}$ | $5$ | $x_{user}\le a_5$ |
$9$ | $x_{user}\ge a_9$ | $4$ | $x_{user}\ge a_4$ |
$8$ | $x_{user}\ge a_8$ | $3$ | $x_{user}\ge a_3$ |
$7$ | $x_{user}\ge a_7$ | $2$ | $x_{user}\ge a_2$ |
$6$ | $x_{user}\ge a_6$ | $1$ | $x_{user}\ge a_1$ |
若不符合表中所有条件,得 $0$ 分;若符合表中的多个条件,则取分数最高的。
如何测试你的输出
在终端中先切换到该试题的目录下:(windows用户请使用cmd)(假设你把输入输出文件、checker 什么的都放在了 rebuild 这个文件夹下)
cd rebuild
我们提供checker这个工具来测试你的输出文件是否是可接受的。使用这个工具的方法是,在终端中运行
./checker_linux64 <case_no>
其中 case_no
是测试数据的编号。例如
./checker_linux64 3
将测试 rebuild3.out 是否可以接受。(windows用户请使用 checker_win32 3
)(什么你是windows 64位?放心吧可以运行win32应用程序的。)
当然我们有对应的 linux 32 位版本:checker_linux32
。如果 linux 用户发现无法运行程序,请尝试执行 chmod +x checker_linux64
或 chmod +x checker_linux32
后重试。
在你调用这个程序后,checker 将根据你给出的输出文件给出测试的结果。
请不要随便更改in文件,防止checker出现不可预知的错误。
另外,你还可以在终端中使用命令
./checker_linux64 –w <case_no>
以将测试点 <case_no>
中每天怪物行进过程中的位置和生命值输出到文件 report.log
中。注意文件 report.log
可能很大,极端情况下文件大小约为 $150\texttt{MB}$。