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. Android中的回调Callback

    回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 例如给安卓添加按钮点击事件, 我们创建了OnC ...

  2. 模拟Excel同一列相同值的单元格合并

    背景 项目中有一个查询工作量,可以将查询的结果导出到Excel表中.在Excel工具中,有一个合并居中功能,可以将选中的单元格合并成一个大的单元格.现在需要在程序中直接实现查询结果的汇总, 问题分析 ...

  3. LintCode-8.旋转字符串

    旋转字符串 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例 对于字符串 "abcdefg". offset=0 => "abcdefg&qu ...

  4. Ansys Workbench热流固耦合仿真配置

    1.Fluent-Thermal-Structural瞬态分析 此模块连接在fluent已实现流体和固体的热流耦合,传递至thermal实际上只是将流体表面温度作为热载荷施加在固体的液体通道表面,极大 ...

  5. 安装django 提示ImportError: No module named setuptools

    安装django前要先安装setuptools 先安装一些必要的包,否则会报错:Python build finished, but the necessary bits to build these ...

  6. HDU 3879 Base Station(最大权闭合子图)

    将第i个用户和他需要的基站连边,转化成求二分图的最大权闭合子图. 答案=正权点之和-最小割. # include <cstdio> # include <cstring> # ...

  7. datepicker约束开始时间和结束时间

    datepicker约束开始时间和结束时间作用就是:选择要搜索的日期范围. <!DOCTYPE html> <html lang="en"> <hea ...

  8. BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)

    由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...

  9. (一)MySQL学习笔记

    1.MySQL安装 下载地址:https://dev.mysql.com/downloads/mysql/ 启动mysql服务 net start mysql 停止mysql服务 net stop m ...

  10. 【以前的空间】BZOJ2733[HNOI2012]永无乡

    启发式合并?! 似乎当时写并查集的时候就有看到过类似于把小并查集并到大并查集上的说法,原来这就是启发式…… 具体做法就是把小树里面的一个个拿出来,然后加到大树里面去(裸的不敢相信) const max ...