Description

小Q同学在学习操作系统中内存管理的一种页面置换算法,LRU(LeastRecentlyUsed)算法。
为了帮助小Q同学理解这种算法,你需要在这道题中实现这种算法,接下来简要地介绍这种算法的原理:
1.初始化时,你有一个最大长度为n的空队列,用于暂时存储一些页面的地址。
2.当系统需要加载一个不在队列中的页面时,如果队列已满,则弹出队首元素,并将需要加载的页面加到队尾,
否则直接将需要加载的页面加到队尾。
3.当系统需要加载一个在队列中的页面时,将该页面移至队尾。
在这道题中,小Q同学需要处理有q个请求,每个请求会给定一个整数x,表示系统需要加载地址为x的页面,
而你需要在每个请求完成后给出整个队列中页面的地址之和。为了便于计算,设第i个请求给出的整数为x_i,
第i个请求后你给出的答案为y_i,则对于1<i≤q有x_i=(A*x_(i-1)+B)modp,其中x_1,A,B,p是给
定的整数,并且你只需要输出sigma(i*y_i),1<=i<=Q对2^64取模的值,而不是每个y_i。

Input

第一行包含一个正整数T,表示有T组数据,满足T≤20。
接下来依次给出每组测试数据。对于每组测试数据:
第一行包含两个正整数n和q,满足1≤n≤10^5,1≤q≤10^6。
第二行包含四个整数x_1,A,B和p,满足0≤x_1,A,B<p,1≤p≤10^6+3。

Output

对于每组测试数据,输出一行一个非负整数,表示这组数据的答案。

Sample Input

2
5 10
0 1 1 5
5 10
0 1 1 10

Sample Output

485
1135

思路:加入X,如果X不存在队列,当队列里小于N个,直接加到队尾;否则删去队首删去队尾。 如果X存在队里,那么移到队尾。  我们发现用队列不方便模拟,因为无法删去中间的数,而set来操作又会超时。   因为我们维护的是一个长度为N的窗口,可以用双指针来模拟。 维护一个队列q,如果q[i]=-1,说明位置i已经被删去。同时维护一个pos数组保保存其在队列的位置。 最后用一个队首head来维护现在删到了哪里。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=;
ll a[maxn],A,B,P; int q[maxn],pos[maxn],cnt,head,num;
unsigned long long ans,res;
int main()
{
int T,N,Q;
scanf("%d",&T);
while(T--){
cnt=; ans=; res=; head=; num=;
scanf("%d%d",&N,&Q);
scanf("%lld%lld%lld%lld",&a[],&A,&B,&P);
for(int i=;i<=Q;i++) a[i]=(A*a[i-]+B)%P;
for(int i=;i<=Q;i++) pos[a[i]]=-;
for(int i=;i<=Q;i++){
if(pos[a[i]]==-){
if(num<N) {
num++;
pos[a[i]]=++cnt, q[cnt]=a[i],res+=a[i];
}
else {
while(q[head]==-) head++;
pos[q[head]]=-,res-=q[head],q[head]=-;
pos[a[i]]=++cnt,q[cnt]=a[i],res+=a[i];
}
}
else {
q[pos[a[i]]]=-,pos[a[i]]=++cnt,q[cnt]=a[i];
}
ans+=res*i;
}
cout<<ans<<endl;
}
return ;
}

BZOJ4837:[Lydsy1704月赛]LRU算法(双指针&模拟)的更多相关文章

  1. 【BZOJ4837】LRU算法 [模拟]

    LRU算法 Time Limit: 6 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 小Q同学在学习操作系统中内存管理的 ...

  2. 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法

    一,LRU算法介绍 LRU是内存分配中“离散分配方式”之分页存储管理方式中用到的一个算法.每个进程都有自己的页表,进程只将自己的一部分页面加载到内存的物理块中,当进程在运行过程中,发现某页面不在物理内 ...

  3. python模拟页面调度LRU算法

    所谓LRU算法,是指在发生缺页并且没有空闲主存块时,把最近最少使用的页面换出主存块,腾出地方来调入新页面. 问题描述:一进程获得n个主存块的使用权,对于给定的进程访问页面次序,问当采用LRU算法时,输 ...

  4. FIFO调度算法和LRU算法

    一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了 ...

  5. 【Redis 设置Redis使用LRU算法】

    转自:http://ifeve.com/redis-lru/ 本文将介绍Redis在生产环境中使用的Redis的LRU策略,以及自己动手实现的LRU算法(php) 1.设置Redis使用LRU算法 L ...

  6. 关于LRU算法(转载)

      原文地址: http://flychao88.iteye.com/blog/1977653 http://blog.csdn.net/cjfeii/article/details/47259519 ...

  7. Android图片缓存之Lru算法

    前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...

  8. 缓存淘汰算法--LRU算法

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...

  9. 借助LinkedHashMap实现基于LRU算法缓存

    一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...

随机推荐

  1. init() 方法

    1 /** * servlet init()在web应用程序启动之后,第一个请求到达Servlet之前调用. * 问题1:如果init()中需要处理大量的工作,那么servlet在处理第一个请求需要花 ...

  2. codeforces246E Blood Cousins Return

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  3. git rm -r --cache命令 及 git .gitignore 文件

    git 的  .gitignore 文件的作用是在代码提交时自动忽略一个文件.不将其纳入版本控制系统. 比如.一般我们会忽略IDE自动生成的配置文件等. 如果一个你要忽略的文件已经纳入到了git ,也 ...

  4. sql数据类型转换函数

    1.CAST()CAST (<expression> AS <data_ type>[ length ]) 2.CONVERT()CONVERT (<data_ type ...

  5. phalcon: 目录分组后的acl权限控制

    phalcon: 目录分组后的acl权限控制 楼主在做acl权限的时候,发现官方的acl只能针对未分组的目录,如下: app/ ___|./controller ___|./logic ___|./p ...

  6. 设计模式--模板方法模式C++实现

    模板方法模式C++实现 1定义 定义一个操作的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 实现方案:将算法/逻辑框架放在抽象基类中,并定义好 ...

  7. CCS5 学习笔记1

    CCS5 学习笔记1 2013-09-15 10:35:49 周日边学习ccs5使用边写笔记,准备用一天时间好好学习下ccs5怎么使用,便于以后工作向ccs5平台迁移!

  8. 在写一个iOS应用之前必须做的7件事(附相关资源)

    本文由CocoaChina--不再犹豫(tao200610704@126.com)翻译 作者:@NIkant Vohra 原文:7 Things you must absolutely do befo ...

  9. Day11 - Python操作memcache、redis缓存、rabbitMQ队列

    本周课前必备: 1. Memcached 2. Python操作Memcached模块: https://pypi.python.org/pypi/python-memcached 3. Redis ...

  10. linux下使用FreeRDP 连接 Windows 远程桌面

    linux下使用FreeRDP 连接 Windows 远程桌面   简介 FreeRDP 是一款开源的远程桌面系统,支持多种平台, 在 ubuntu 中使用 FreeRDP 可以很方便的登录到 win ...