#P6928. [ICPC 2016 WF] What Really Happened on Mars?

[ICPC 2016 WF] What Really Happened on Mars?

Description

你有 tt 个进程和 rr 个资源,每个进程包含其起始时间与基础优先级(保证两两不同),以及若干条指令。指令有以下三种:

  • compute:进行计算,消耗 11 微秒。
  • lock k:锁定编号为 kk 的资源,不耗时。
  • unlock k:解锁编号为 kk 的资源,不耗时。

在进程锁定资源后,这个进程就拥有了这个资源直到这个进程将它解锁。保证任意进程只会解锁最近锁定的资源,不会锁定自身拥有的资源,且在进程结束时不会拥有任何资源。

每个资源有一个固定的属性最高优先级,即包含锁定该资源指令的所有进程的最高基础优先级

有一个处理器处理这些进程。处理器有一个时钟初始为 00,然后重复执行下列步骤:

  1. 找出所有正在运行的进程。如果进程开始的时间不大于处理器的时钟且该进程的指令未运行完毕,那么称这个进程正在运行。

  2. 决定当前所有正在运行的进程的优先级,以及哪些正在运行的进程会被阻塞。进程 TT 会被阻塞当且仅当:

    • 进程 TT 的下一条指令是锁定资源 kk
    • 资源 kk 已经被其他进程拥有,或存在另一个进程拥有某个资源 \ell\ell最高优先级大于等于 TT当前优先级

    此时我们称进程 TT 被所有拥有资源 kk 或满足条件的资源 \ell 的进程阻塞。定义 TT当前优先级为所有它阻塞的进程的当前优先级与它本身的基础优先级的最大值。

  3. 执行当前优先级最高且没有被阻塞的进程的下一条指令。如果不存在这样的进程或者执行的指令是 compute,则将时钟加 11 微秒。

你需要求所有进程的结束时间。可以证明所有进程一定会结束。

Input Format

第一行两个整数 t,rt,r 表示进程和资源个数。

接下来 tt 行每行描述一个进程,格式如下:

  • 三个整数 s,b,as,b,a,表示进程起始时间、基础优先级、指令条数。
  • 接下来 aa 个字符串,每个字符串表示一条指令。字符串形如 Cn 表示连续 nncompute 指令(相互独立),Lk 表示锁定资源 kkRk 表示解锁资源 k

Output Format

tt 行每行一个整数表示进程执行完毕的时间。

数据范围:1t,r20,s104,1bt1 \le t,r \le 20,s \le 10^4,1 \le b \le t 且互不相同,a100a \le 100Cnn100n \le 100Lk,Rk1kr1 \le k \le r

Translated by pokefunc (uid=188716)

3 1
50 2 5 C1 L1 C1 U1 C1
1 1 5 C1 L1 C100 U1 C1
70 3 1 C1

106
107
71

3 3
5 3 5 C1 L1 C1 U1 C1
3 2 9 C1 L2 C1 L3 C1 U3 C1 U2 C1
1 1 9 C1 L3 C3 L2 C1 U2 C1 U3 C1

8
15
16