#P14713. [ICPC 2023 Tehran R] Monster Warehouse
[ICPC 2023 Tehran R] Monster Warehouse
Description
:::align{center}
:::
Mike 和 Sally 在怪兽电力公司的仓库担任管理员。他们的日常任务是处理入库请求并更新仓库库存。请求仅包括购买、出售、拆箱和装箱容器。仓库包括货物和容器,且空间无限。一个容器可以包含货物或其他容器作为子容器。
请求的具体格式如下。
- BUY
<CONTAINER_DESCRIPTION> - SELL
<CONTAINER_ID> - UNPACK
<CONTAINER_ID> - PACK
<CONTAINER_DESCRIPTION>
每个不位于任何其他容器内的容器都由一个唯一的正整数 ID 标识。为容器分配 ID 是顺序进行的,从 开始。一个 ID 有效当且仅当其容器存在于仓库中,否则无效。
容器描述用括号括起来,并列出了内容,内容可以是货物或子容器。货物仅通过其名称标识,名称由不区分大小写的英文字母组成。同一种货物可能有多单位。为了表示数量,可在货物名称前或后放置一个正整数 'N'(用一个空格分隔),其中 是货物的数量。例如,$((tomato, potato), 4 celery, (wood, (silk 3, banana 2)))$ 描述了一个包含四单位芹菜和两个子容器的容器。
每个请求的描述如下:
- BUY:一个新的容器被转移到仓库中,并分配一个 ID。
- SELL:将具有给定 ID 的现有容器运出,其 ID 变为无效。
- UNPACK:从容器中提取所有货物和子容器,并将其添加到仓库中。此外,子容器成为新容器并获得自己的 ID。为新容器分配 ID 基于它们在容器描述中出现的顺序(从左到右)。例如,将以下两行作为前两个请求处理,会导致添加一单位芹菜,并向仓库添加三个 ID 为 、 和 的容器,且 ID 变为无效。
- PACK:将 PACK 请求中指定的货物分组到一个新容器中,然后分配下一个可用的 ID。
Mike 和 Sulley 按照接收顺序处理请求。任何具有无效容器 ID 的请求都必须被丢弃。此外,对于 PACK 请求,他们需要检查仓库中每种货物是否有足够的数量。
怪兽电力公司的特工 Roz 曾对 Mike 说过:“我在看着你,瓦索斯基。一直看着,始终看着。”她把她的办公桌推进了他们的办公室,并要求查看请求和报告。她关注每一个细节。她正在审查每个请求,并可能提出一些问题。她的问题可能是以下几种类型之一:
? COUNT <good>:给定货物有多少单位存在于容器之外?? CONTAINS <good>:有多少个容器(具有 ID)包含给定货物,即货物在容器内,或存在一个递归的子容器包含该货物。? MIN <good>:至少需要拆开多少个容器才能得到一单位该货物。如果不可能,则答案为 。
Mike 和 Sulley 需要使用一个整数来回答这些查询。
在帮助 Mike 和 Sulley 之前,请仔细阅读样例。
Input Format
输入包含 个来自 Roz 审查期间的请求或查询 ();每个占一行。每种货物的名称长度限制为 个字符。每个容器描述最多有 个字符,且输入总大小小于 个字符。
Output Format
报告中的每一行与一个请求或 Roz 的问题相关联。对于每个 BUY、SELL、PACK、UNPACK 请求,如果请求未被丢弃,则打印 OK。否则打印 DISCARD。如果请求是 UNPACK,则在打印 OK 之后,打印添加到仓库的容器数量(更多细节请阅读样例)。对于 Roz 的每个查询,只需在一行中打印一个整数。
BUY (10 apple, 10 carrot, 10 banana, ())
UNPACK 1
UNPACK 2
PACK (3 apple, (5 cArrot, 2 banana))
PACK (3 apple, (5 carrOt, 1 banana))
PACK (5 apple, (3 banana))
? MIN apple
? MIN CaRRoT
? CONTAINS apple
OK
OK, 1 container added.
OK, No containers added.
OK
OK
DISCARD
0
2
2
BUY (apple, (banana, 3 carrot))
BUY ((banana, apple), (banana, carrot))
? MIN apple
UNPACK 1
? COUNT apple
? COUNT carrot
? CONTAINS banana
OK
OK
1
OK, 1 container added.
1
0
2
BUY ((duck 2, carrot), 1 celery)
? MIN duck
? MIN carrot
? MIN celery
? MIN test
SELL 10
PACK (celery)
UNPACK 1
UNPACK 1
PACK (celery)
? COUNT celery
? COUNT carrot
? CONTAINS celery
? CONTAINS carrot
BUY ((duck 8, carrot), ((7 duck), celery))
UNPACK 4
UNPACK 5
UNPACK 6
? COUNT DUCK
? MIN duck
OK
2
2
1
-1
DISCARD
DISCARD
OK, 1 container added.
DISCARD
OK
0
0
1
1
OK
OK, 2 containers added.
OK, No containers added.
OK, 1 container added.
8
0
Hint
翻译由 DeepSeek V3 完成
京公网安备 11011102002149号