#P2740. Book Replacement

Book Replacement

描述

Hachioji的作业截止日期是明天。为了完成任务,学生们必须在图书馆复印许多参考书的页面。

所有参考书都放在一个储藏室里,只有图书管理员可以进入。要获得某本参考书的页面复印件,学生应向图书管理员提出请求。图书管理员会将书从储藏室取出,并根据请求复印页面。整体情形如图 1 所示。

学生在柜台前排队。一次只能请求一本书。如果某名学生还有其他请求,该学生在请求完成后会重新排到队尾。

在储藏室中,有 mm 张桌子 D_1,,D_mD\_1,\dots,D\_m 和一个书架。它们按从门口到房间后部的顺序排列。每张桌子最多可放 cc 本书。当学生请求某本书时,图书管理员按 D_1,,D_mD\_1,\dots,D\_m 的顺序在桌子上寻找,然后再到书架上寻找。找到后,取出该书并交给学生复印页面。

之后,图书管理员带着该书返回储藏室,根据以下流程将其放回 D_1D\_1

  1. 如果 D_1D\_1 未满(即 D_1<c|D\_1|<c),则将请求的书直接放到 D_1D\_1

  2. 如果 D_1D\_1 已满,则:

    • 将请求的书临时放到离门口最近的未满桌子,若所有桌子都已满,则放到书架;
    • 找出 D_1D\_1 中最久未被请求的那本书(即最近最少使用的书),取出;
    • 将该书放到离门口最近的未满桌子(不包括 D_1D\_1),若其他桌子都已满,则放到书架;
    • 从临时位置取回请求的书;
    • 最后将请求的书放回 D_1D\_1

你的任务是编写程序模拟学生和图书管理员的行为,并计算整个过程的总开销。访问每张桌子或书架(放入或取出书)的开销分别为:对 $D_i$ 的访问开销为 $i$,对书架的访问开销为 $m+1$。其他操作的开销可忽略。

初始时,所有桌子上均无书。图书馆开放后,不会有新的学生出现。


输入

输入包含多组数据。以一行 0 0 0 表示输入结束(该行不作为数据集)。 每组数据格式如下:

m c n

k1

b11 b12 … b1k1

…

kn

bn1 bn2 … bnkn
  • 所有数据项均为正整数。
  • mm(桌子数)≤ 10;cc(每桌最大书数)≤ 30;nn(学生数)≤ 100;
  • k_ik\_i(第 ii 名学生的请求数)≤ 50;
  • b_ijb\_{ij}(第 ii 名学生第 jj 次请求的书 ID)< 100;不同书 ID 互不相同;学生也可能重复请求同一本书。

例如,数据集:

3 1 2

3
60 61 62

2
70 60

中,m=3,c=1,n=2m=3,c=1,n=2。第一名学生依次请求书 60、61、62;第二名学生依次请求 70、60。 该数据集的开销计算如下:

  1. 第1名学生第1次请求,管理员从书架取 60 并放到 D_1D\_1,开销 (m+1)+1=5(m+1)+1=5
  2. 第2名学生第1次请求,管理员取 70 放到 D_2D\_2,再将 60 从 D_1D\_1 移到 D_3D\_3,再将 70 从 D_2D\_2 移到 D_1D\_1,开销 4+2+3+1+1+1+1=134+2+3+1+1+1+1=13; …依次类推,总开销为 58。

输出

对于每组输入数据,输出该组请求处理的总开销。每组输出占一行。


输入数据 1

2 1 1
1
50
2 1 2
1
50
1
60
2 1 2
2
60 61
1
70
4 2 3
3
60 61 62
1
70
2
80 81
3 1 2
3
60 61 62
2
70 60
1 2 5
2
87 95
3
96 71 35
2
68 2
3
3 18 93
2
57 2
2 2 1
5
1 2 1 3 1
0 0 0

输出数据 1

4
16
28
68
58
98
23

来源

Japan 2005