UVA 11423 - Cache Simulator (树状数组)
题目链接
题目大意:模仿磁盘缓冲区的工作机制,给你n个不同size的(递增的)磁盘缓冲区,给你要访问的数据,根据LRU原则,问每个size的磁盘分别有多少次miss(数据没有在缓存中就是miss),
解题思路:因为数据最多有10^7,所以数据访问的序列最长也就是10^7。树状数组的每个位置代表的是访问序列的位置有没有数,因为如果之前的数在后面有访问到的话,那么这个数就应该在后面了,这样前面的那个数就应该不存在。做法:先将要访问的数据序列处理出来,放在队列中,并且找到每个数之前出现过的离它最近的那个位置。查询当前的位置和之前那个出现的位置之间有多少个数(假设dis个);小于dis的cache的miss++,然后要记得删除树状数组之前的那个位置上的值。如果是没有出现过的数,那么miss肯定是要+1的。注意:每次state都要重新计算miss。
代码:
#include
#include
#include
#include
#include