E. 2023春-B-5 LRU-K 缓存

    传统题 200ms 64MiB

2023春-B-5 LRU-K 缓存

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题目描述

LRU 全称为 Least Recently Used,即“最近最少使用”。LRU 缓存机制是指,当缓存满了,而缓存区外面的一个新数据被调用的时候,将缓存中最近最少使用(即最长时间没有被使用过)的数据清除,为新数据开辟出空间。

LRU-K 是 LRU 算法的变种,K 代表最近使用的次数,LRU 可以认为是 LRU-1。不同于 LRU 算法的是,LRU-K 算法需要维护两套队列(历史访问队列,缓存队列)。当历史访问队列中的数据被命中 K 次后,数据才会移动至缓存队列中。

例如:假设所有队列长度为 5,初始内存中没有数据。使用 LRU-2 算法,数据访问顺序为:9,5,6,7,8,3,8,9,5,9,8,3,4,7,5,6。则历史访问队列和缓存队列的变化如下表所示:

访问元素 历史访问队列 缓存队列
9,5,6,7,8
3 5,6,7,8,3
8 5,6,7,3 8
9 5,6,7,3,9
5 6,7,3,9 8,5
9 6,7,3 8,5,9
8 5,9,8
3 6,7 5,9,8,3
4 6,7,4
7 6,4 5,9,8,3,7
5 9,8,3,7,5
6 4 8,3,7,5,6

你的任务就是实现这种 LRU-K 缓存机制。

输入格式

输入第一行给出 3 个正整数:KK1<K51<K \le 5)、NN (104\le 10^4) 和 MM (105\le 10^5),分别为规定的缓存命中次数、队列的大小(假设历史访问队列和缓存队列的大小一致)和被调用的数据的数量。随后一行给出 MM 个被调用的数据的编号。编号为区间 [1,2×104][1, 2\times 10^4] 内的一个整数。一行中的数字以空格分隔。

输出格式

在第一行中输出历史访问队列中数据的编号。第二行输出缓存队列中数据的编号。顺序为队头至队尾。数据间以 1 个空格分隔,行首尾不得有多余空格。如果队列为空则输出 - 表示空行。

样例

2 5 17
9 5 6 7 8 3 8 9 5 9 8 3 4 7 5 6 9
4 9
8 3 7 5 6
3 5 10
9 5 6 7 8 3 8 9 5 9
7 3 8 5 9
-

限制

Java (javac) 时间限制 900 ms 内存限制 256 MB

其他编译器 时间限制 200 ms 内存限制 64 MB

PAT2023春季重现赛

未参加
状态
已结束
规则
IOI
题目
9
开始于
2025-11-30 18:30
结束于
2025-11-30 22:00
持续时间
3.5 小时
主持人
参赛人数
71