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. Uva 1600 Patrol Robot (BFS 最短路)

    这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #inclu ...

  2. [基于NetCore的简单博客系统]-登录

    0-项目背景 一个基于.NET CORE RAZOR PAGES的简单博客系统 技术栈全部采用微软官方实现方式,目的是熟悉新技术 项目地址:https://github.com/ganqiyin/BL ...

  3. iOS- <项目笔记>项目配置常见文件

    项目常见文件 1.main.m * 里面有一个程序的入口:main函数 2.Prefix.pch文件 * pch文件中的内容能被项目中的其他任何文件共享\包含\访问 * 如果定义的内容只用在OC环境中 ...

  4. OSG学习:位置变换节点示例

    osg::PositionAttitudeTransform节点. #include <osgViewer\Viewer> #include <osg\Node> #inclu ...

  5. ci tp重定向

    server { listen 80; #listen [::]:80; server_name tpblog.yeves.com; index index.html index.htm index. ...

  6. c++读取文件夹及子文件夹数据

    这里有两种情况:读取文件夹下所有嵌套的子文件夹里的所有文件  和 读取文件夹下的指定子文件夹(或所有子文件夹里指定的文件名) <ps,里面和file文件有关的结构体类型和方法在 <io.h ...

  7. 如何在存储过程中执行set命令  我来答

    1.EXEC使用EXEC命令两种用种执行存储程另种执行态批处理所讲都第二种用 面先使用EXEC演示例,代码1DECLARE @TableName VARCHAR(50),@Sql NVARCHAR ( ...

  8. 【bzoj4008】[HNOI2015]亚瑟王 概率dp

    题目描述 $n$ 张牌,$r$ 轮游戏,每轮从左向右操作,遇到第 $i$ 张牌有 $p_i$ 的概率选中,选中会产生 $d_i$ 的贡献,丢弃掉该牌并结束这一轮,否则继续下一张.问最终的期望贡献. 输 ...

  9. 数据库sharding,横向扩展

    学习资料如下: http://www.cnblogs.com/skyme/p/3459765.html http://my.oschina.net/anthonyyau/blog/307165 htt ...

  10. 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队

    传送门 Description 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum ...