#163. 【清华集训2015】新式计算机

//题目太长,为了我的小心脏,我都没忍心读下去。。。。。。

这是一道提交答案题

伟大的人类智慧之神 clevertick 奋战三星期,造出了一台新式计算机(其实他造计算机只用了三天,剩余的时间都在编译、调试……),起名 CTOX。现在,他可以抛弃自己旧的机器,来用 CTOX 完成自己的工作了……

CTOX 拥有足够大(可以认为是无穷大)的内存,并且它的内存地址是二维的,也就是说,一个内存地址可以使用一对整数 (x,y)(x,y) 来表示,和这个地址相邻的4个地址分别是 (x+1,y)(x+1,y)(右)、(x,y+1)(x,y+1)(上)、(x−1,y)(x−1,y)(左)、(x,y−1)(x,y−1)(下),每个内存地址都可以存储一个 0∼655350∼65535 范围内的整数值。然而,CTOX 没有寄存器,只有一个空闲的开关可以用来存储临时数据(既然是开关,那就只有开与关两种状态了)。CTOX 每次只能读写一个内存地址,它用一个指针来指向目前正在读写的内存地址,读写指针每次从一个地址移动到与它相邻的某个地址称为移动一单位。CTOX 每次启动时,都会初始化——清空所有内存(即将所有内存中存储的值全部清零)、关上这个空闲开关、读写指针指向 (0,0)(0,0) 处。

由于 CTOX 的特殊架构,在给它编程时,也只能使用一种特殊的指令集(同样由 clevertick 设计),这种指令集包含的指令有:

x:当开关为开时,指针向左移动 11 单位,否则指针向右移动 11 单位;

X:当开关为开时,指针向左移动,否则指针向右移动,移动的单位数等于移动前指针所指内存地址处存储的值;

u:当开关为开时,指针向上移动 11 单位,否则什么也不做;

U:当开关为开时,指针向上移动,移动的单位数等于移动前指针所指内存地址处存储的值,否则(开关为关时)什么也不做;

d:当开关为开时,指针向下移动 11 单位,否则什么也不做;

D:当开关为开时,指针向下移动,移动的单位数等于移动前指针所指内存地址处存储的值,否则(开关为关时)什么也不做;

I:当开关为开时,将指针所指内存地址处存储的值加 11(原值为 6553565535 则加 11 后变为 00),否则(开关为关时)什么也不做;

S:若目前指针所指内存地址处存储的值为奇数,则将开关打开,否则将开关关上;

P:触发一次开关(原来开则关,原来关则开);

l:将目前指针所指内存地址处存储的值左移 11 位(先转化为 1616 位二进制数,然后丢弃最高位,其余位顺次左移 11 位,最低位补 00);

r:将目前指针所指内存地址处存储的值右移 11 位(先转化为 1616 位二进制数,然后丢弃最低位,其余位顺次右移 11 位,最高位补 00);

v:将目前指针所指内存地址处存储的值各位逆序(先转化为 1616 位二进制数,然后逆序,即 x15x14?x1x0x15x14?x1x0 变为 x0x1?x14x15x0x1?x14x15)

E:表示终止整个程序的运行,即一旦执行到该指令,程序立即终止,这也是唯一的能让程序终止的指令。

此外,它还包含两种特殊的括号格式:

(指令序列)数字:表示执行括号内的指令序列指定次数,数字必须有且必须是常数,值为 1∼655351∼65535,如,(u)3 表示当开关为开时,指针向上移动 33 单位,否则什么也不做;

[指令序列]:在开关为开时,不断执行括号内的指令序列,相当于 while(开关为开){指令序列}

CTOX 程序执行时,所有不含括号的的指令序列均严格地从左至右执行,当且仅当执行到指令 E 时,程序终止(若已经执行到程序末尾,之后已经无指令时仍未发现指令 E,则会报错)。内存中用于存储程序的空间位于距 (0,0)(0,0) 处很远(你可以认为是无限远,即程序的执行不会破坏程序本身),但这个空间不够大,所以你的程序最多只能包含 1000010000 个字符(括号和数字也计入字符),此外,当一个程序已经执行了 2012052620120526 条指令后,仍然没有终止,则 CTOX 处理器会认为程序已经死掉,并强行终止程序。

clevertick 使用 CTOX 很快完成了他的工作。突然,某个智商较低的人发现了 CTOX 的强大之处,于是他也想来使用 CTOX。clevertick 显然不会直接同意的,于是给这个人布置了 1010 个任务,要求他用 CTOX 的指令集编程,完成这 1010 个任务。由于这个人智商低,实在无法完成任务,于是求助于你,你能帮助他么?

这 1010 个任务分别对应于本题的 1010 个测试点,任务的编号即为测试点的编号。(注:对于每个任务而言,初始时除了任务描述中说明的内存地址存有值之外,其余内存地址存储的值均为 00,开关为关,指针指在地址 (0,0)(0,0) 处)

任务描述

  1. 初始时,地址 (0,0)(0,0) 处存有一个值,若该值是偶数,则指针在地址 (1,1)(1,1) 处终止,否则(是奇数)指针在地址 (−1,−1)(−1,−1) 处终止。终止时,任何地址处存储的值、开关状态均没有限制。
  2. 初始时,地址 (0,0)(0,0) 处存有一个值,若该值是 44 的倍数,则指针在地址 (1,1)(1,1) 处停止,否则(不是 44 的倍数)指针在地址 (−1,−1)(−1,−1) 处终止。终止时,任何地址处存储的值、开关状态均没有限制。
  3. 初始时,地址 (0,0)(0,0) 处存有一个值,要求将这个值赋予地址 (2,3)(2,3) 处。终止时,除地址 (2,3)(2,3) 处的值外,其余地址处的值、指针位置、开关状态均没有限制。
  4. 初始时,地址(1,1)(1,1)处和(−1,−1)(−1,−1)处各存有一个值,要求判断这两个值是否相等,若相等,在地址(0,0)(0,0)处存入11,若不等,在地址(0,0)(0,0)处存入22。终止时,除地址(0,0)(0,0)处的值外,其余地址处的值、指针位置、开关状态均没有限制。
  5. 初始时,地址(1,1)(1,1)处和(−1,−1)(−1,−1)处各存有一个值,求出这两个值的按位与 AND,并将结果存入地址(0,0)(0,0)处。终止时,除地址(0,0)(0,0)处的值外,其余地址处的值、指针位置、开关状态均没有限制。
  6. 初始时,地址(1,1)(1,1)处和(−1,−1)(−1,−1)处各存有一个值,求出这两个值的按位异或 XOR,并将结果存入地址(0,0)(0,0)处。终止时,除地址(0,0)(0,0)处的值外,其余地址处的值、指针位置、开关状态均没有限制。
  7. 初始时,地址(1,1)(1,1)处和(−1,−1)(−1,−1)处各存有一个值,求出这两个值相加的和mod 6553665536的值,并将结果存入地址(0,0)(0,0)处。终止时,除地址(0,0)(0,0)处的值外,其余地址处的值、指针位置、开关状态均没有限制。
  8. 初始时,有6464个数依次存储在地址 (1,0),(2,0)?(64,0)(1,0),(2,0)?(64,0) 处,其中有且仅有一个00,要求找到这个值为00的地址并终止在这里。终止时,任何地址处存储的值、开关状态均没有限制。
  9. 初始时,有3276832768个数依次存储在地址(1,0),(2,0)?(32768,0)(1,0),(2,0)?(32768,0)处,其中有且仅有一个00,要求找到这个值为00的位置并终止在这里。终止时,任何地址处存储的值、开关状态均没有限制。
  10. 初始时,有40964096个数依次存储在地址(1,0),(2,0)?(4096,0)(1,0),(2,0)?(4096,0)处,求出这些值中的最大值并将其存储在地址(0,0)(0,0)处。终止时,除地址(0,0)(0,0)处的值外,其余地址处的值、指针位置、开关状态均没有限制。

本题没有输入文件,你需要对这1010个任务,分别提交对应的输出文件 ctox1.out ~ ctox10.out,每个输出文件一行,存放你编写的程序(若输出文件有多行,则在评测时除了第一行外,其它的行都会被舍弃)。

你如何测试自己的程序

本题提供了测试工具——模拟器 simulator(Linux)/simulator.exe(Windows),你可以用以下两种方式使用它。

方式一:./simulator <程序文件>(Linux)/simulator.exe <程序文件>(Windows)

模拟器将读取程序文件中的第一行作为程序,执行它并将程序终止时的结果写入 log.txt 中。在这种方式下,初始时任何内存地址处存储的值均为0。

方式二:./simulator <程序文件> <输入文件>(Linux)/simulator.exe <程序文件> <输入文件>(Windows)

其中,输入文件每行包含三个整数x,y,vx,y,v,表示将内存地址(x,y)(x,y)处的初始值设为vv,必须满足 0≤v≤655350≤v≤65535,若不满足则视为结束标志(后面的所有内容将被舍弃)。

模拟器将先读取输入文件中的每一行直到读取到不满足0≤v≤655350≤v≤65535的行为止,并设置对应内存地址的初始值,然后读取程序文件中的第一行作为程序,执行它并将程序终止时 的结果写入log.txt中。在这种方式下,除输入文件中指定的地址之外,初始时任何内存地址处存储的值均为00。

log.txt包含程序执行步数(每条指令一步),以及程序终止时,CTOX的状态——指针位置、开关状态、所有存储的值非00的内存地址及其存储的值。

如果相应的文件不存在、程序出现语法错误(含有不允许的字符、括号不匹配、()后的数字不在11~6553565535范围内等)、长度超过1000010000个字符、执行步数超过了2012052620120526、或者执行到程序末尾时未发现E指令,模拟器会报错,此时不会生成log.txt文件。

评分说明

在评分时,我们对每个测试点设置了1010组数据,每组数据表示该测试点的一种初始情况(即初始时存有值的那些地址存储的值),在数据规模的设置上,保持一定的梯度。

对于每个测试点:

如果你未提交对应的输出文件,提交的输出文件中的程序有语法错误,或者程序的字符数超过了1000010000,则该测试点的所有数据均得00分。

否则,我们会依次以该测试点的每组数据作为输入,执行你提交的程序。对于该组数据,如果你的程序没有完成任务的要求,或者执行步数超过了2012052620120526,则得00分,否则得11分。

你本题的得分为所有测试点的所有数据的得分之和。

提示

请妥善保管所有附加文件,以免误删或误改。

时间: 2024-12-20 06:04:40

#163. 【清华集训2015】新式计算机的相关文章

清华集训2015 V

#164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数与现实世界有所不同. 这个电阻器内有编号为 1∼n1∼n 的 nn 个独立水箱,水箱呈圆柱形,底面积为 1 m21 m2,每个水箱在顶部和底部各有一个阀门,可以让水以 1 m3/s 的流量通过,每个水箱的上阀门接水龙头,可以无限供应水,下阀门不接东西,可以让水流出.水箱顶部和底部都有一个接口,水的电

uoj164. 【清华集训2015】V 统计

坑爹题面:http://uoj.ac/problem/164 正常题面: 对于一个序列支持下列5个操作: 1.区间加x 2.区间减x并与0取max 3.区间覆盖 4.单点查询 5.单点历史最大值查询 题解: 每个区间维护一个标记函数f(x)=max(x+a,b) 那么两个标记 f 和 g 的合并就是f(g(x))=max(x+max(fa+ga,-inf),max(fb+ga,gb))(假设f在前g在后) 区间加减就是打上max(x,0),区间覆盖就是打上max(-inf,x) 只要记录历史最大

UOJ #164 【清华集训2015】 V

题目链接:V 这道题由于是单点询问,所以异常好写. 注意到每种修改操作都可以用一个标记\((a,b)\)表示.标记\((a,b)\)的意义就是\(x=\max\{x+a,b\}\) 同时这种标记也是支持合并的.有\((a,b)+(c,d)=(a+c,\max\{b+c,d\})\) 用上这种标记的话,\(1\)操作就是\((x,0)\),\(2\)操作就是\((-x,0)\),\(3\)操作就是\((-inf,x)\). 要查询单点值的话只要把所有标记都下放了就好了. 这种标记也支持取\(\ma

[uoj164][清华集训2015]V——线段树

题目大意: 传送门 思路: 对于这么多的操作,以及询问时的取历史最大值,用一般的线段树显然不太好做. 于是考虑把每个操作转化成\(h_i=\max(h_i+a,b)\)的形式,不难发现第一种和第二种就是\(h_i=\max(h_i+x,0)\),第三种即\(h_i=\max(h_i-inf,x)\). 于是我们在线段树上对于每一个节点维护这两个标记,考虑如何合并标记: \[\begin{aligned} x &=\max(\max(x+a,b)+a',b')\ & =\max(\max(x

[清华集训2015]灯泡(浙江大学ZOJ 3203 Light Bulb)

Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow and he has only one light bulb in his house. Every night, he is wandering in his incommodious house, t

UOJ #164 【清华集训2015】V (线段树)

题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,...,x_k\) 那么则有: 当前值就是该序列的最大后缀和,历史最大值就是该序列的最大子段和! 然后如果把最大子段和定义加法,那么就变成了区间加单点查询. 直接线段树维护即可,时间复杂度\(O(n\log n)\). (好吧,其实似乎把赋值看做减去正无穷再加\(x\)似乎是可以被卡爆long long的-

[UOJ 160][清华集训2015]斗地主

文字 数字 较多,加载略慢 题目链接 Emm怎么没人做啊,网上都找不到题解我怎么抄 首先大力模拟,写一个对抗搜索,记录当前玩家的牌,对手的牌,当前玩家,对手上一次出的牌 然后加一个记忆化搜索,这样可以轻松跑出前两个Subtask(当然你可以加上O2优化跑得快一点) 然后我大力跑一下Subtask3,每个点都在\(1s~2s\)左右,然后跑了几十分钟也跑出来了 当然或许是因为i5-8250U然后开一大堆窗口的原因(复杂度爆炸(不过低压U确实慢 然后改成二分答案+判定,这样可以在搜索时加很多剪枝,比

bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct

[清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一位火焰之神 “我将赐予你们温暖和希望!” 只见他的身体中喷射出火焰之力 通过坚固的钢铁,传遍了千家万户 这时,只听见人们欢呼 “暖气来啦!” 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小R的

uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

[清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N.    矩阵中每个数都是 [0,N] 中的自然数.    每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每行中 0 恰好出现 M−N 次.    每列中,[1,N] 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,