LRU算法

Time Limit: 6 Sec  Memory Limit: 128 MB
[Submit][Status][Discuss]

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,满足。
  第二行包含四个整数x_1,A,B和p,满足。

Output

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

Sample Input

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

Sample Output

  485
  1135

HINT

  1≤n≤10^5, 1≤q≤10^6
  0≤x_1,A,B<p, 1≤p≤10^6+3

Main idea

  队列元素个数上限为n。每次加入一个元素x,
  1.如果x不在队列中:
    1.如果队列没满,把x放在队尾;
    2.如果队列元素满了,把队头删掉,x放在队尾。
  2.如果x在队列中:
    把x删掉,把x扔到队尾。

  定义val为当前队列中所有元素和,求Σi*val。

Solution

  直接用数组模拟即可,我们设定PD[i]表示 i 这个位置是否有元素pos[i]表示元素 i 所在的位置,然后用一个 q 表示当前队列

  那么显然删除队头的话,只要删除当前第一个有元素的位置,加入的话扔在队尾即可。

  中间用num、val记录元素个数以及元素和即可。

  (至于对2^64取模,就是unsigned long long自然溢出即可。)

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;
typedef unsigned long long ull; const int ONE = 1e5+;
const int INF = ; int T;
int n,m;
int x,A,B,p;
int PD[],pos[];
int q[];
int Ans; inline int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} void Solve()
{
n=get(); m=get();
x=get(); A=get(); B=get(); p=get();
ull Ans = , val = ;
int tou=, wei=, num=; for(int i=;i<=max(n,m);i++) PD[i] = ;
for(int i=;i<=p;i++) pos[i] = ;
for(int i=;i<=m;i++)
{
if(!pos[x])
{
if(num == n)
{
while(!PD[tou]) tou++;
pos[q[tou]] = ; PD[tou] = ;
val -= q[tou]; num--;
}
q[++wei] = x;
pos[x] = wei; PD[wei] = ;
val+=x; num++;
} else
{
q[++wei] = x;
PD[pos[x]] = ; pos[x] = wei; PD[pos[x]] = ;
} x = ((long long)A*x%p + B) % p;
Ans += i*val;
} cout<<Ans<<endl;
} int main()
{
T=get();
while(T--)
Solve();
}

【BZOJ4837】LRU算法 [模拟]的更多相关文章

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

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

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

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

  3. 虚存管理页面置换算法 — FIFO和RUL算法模拟实现

    本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...

  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. 软工网络15团队作业4——Alpha阶段敏捷冲刺-3

    一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 依靠HTML 逻辑框架等技术完成程序界面前端的实现. 明天计划完成的工作: 依靠css 逻辑框架等技术完成程序界面前端的实现. 工作中遇到的 ...

  2. react-event-pooling

    react-event-pooling 事件池 https://codesandbox.io/s/3xp4y9zp7q https://reactjs.org/docs/events.html#eve ...

  3. shell脚本学习—Shell执行脚本

    Shell作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行这一条,这种方式称为交互式,但还有另一种执行命令的方式称为批处理方式,用户事先写一个Shell脚本,Shell可以一次把这些命 ...

  4. linux系统环境代理设置

    系统上网代理设置: 1.编辑文件/etc/profile,增加如下两行 export http_proxy=http://ip:port export https_proxy=http://ip:po ...

  5. BZOJ4754 JSOI2016独特的树叶(哈希)

    判断两棵无根树是否同构只需要把重心提作根哈希即可.由于只添加了一个叶子,重心的位置几乎不发生偏移,所以直接把两棵树的重心提起来,逐层找哈希值不同且对应的两子树即可.被一个普及组子问题卡一年. #inc ...

  6. python 中的queue 与多进程--待继续

    一.先说说Queue(队列对象) Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的“先吃先拉”与“后吃先吐”,其实就是这里说的队列,队列的构造的时候可以定义它 ...

  7. 在@Async注解下RequestContextHolder.getRequestAttributes() 获得null的情况

    我们有的时候会在service层获取request填充一些诸如用户名和IP地址等信息,这个时候如果不想从Controller层传request,可以在service直接使用 HttpServletRe ...

  8. Android APP性能优化(最新总结)

    导语   安卓大军浩浩荡荡,发展已近十个年头,技术优化日异月新,如今Android 8.0 Oreo 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得And ...

  9. POJ1284:Primitive Roots——题解

    http://poj.org/problem?id=1284 给一个奇质数p,求p的原根数量. 有一个结论:当正整数n存在原根时,其一共有phi(phi(n))个不同余的原根. 所以答案为phi(p- ...

  10. webpack css压缩方案

    css-loader原有的minimize选项在1.0.0版本已经移除,不能使用其进行css压缩. 目前可行的css压缩方案有: 1. postcss-loader with cssnano or u ...