BZOJ4837:[Lydsy1704月赛]LRU算法(双指针&模拟)
Description
Input
Output
对于每组测试数据,输出一行一个非负整数,表示这组数据的答案。
Sample Input
5 10
0 1 1 5
5 10
0 1 1 10
Sample Output
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算法(双指针&模拟)的更多相关文章
- 【BZOJ4837】LRU算法 [模拟]
LRU算法 Time Limit: 6 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 小Q同学在学习操作系统中内存管理的 ...
- 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法
一,LRU算法介绍 LRU是内存分配中“离散分配方式”之分页存储管理方式中用到的一个算法.每个进程都有自己的页表,进程只将自己的一部分页面加载到内存的物理块中,当进程在运行过程中,发现某页面不在物理内 ...
- python模拟页面调度LRU算法
所谓LRU算法,是指在发生缺页并且没有空闲主存块时,把最近最少使用的页面换出主存块,腾出地方来调入新页面. 问题描述:一进程获得n个主存块的使用权,对于给定的进程访问页面次序,问当采用LRU算法时,输 ...
- FIFO调度算法和LRU算法
一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了 ...
- 【Redis 设置Redis使用LRU算法】
转自:http://ifeve.com/redis-lru/ 本文将介绍Redis在生产环境中使用的Redis的LRU策略,以及自己动手实现的LRU算法(php) 1.设置Redis使用LRU算法 L ...
- 关于LRU算法(转载)
原文地址: http://flychao88.iteye.com/blog/1977653 http://blog.csdn.net/cjfeii/article/details/47259519 ...
- Android图片缓存之Lru算法
前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...
- 缓存淘汰算法--LRU算法
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...
- 借助LinkedHashMap实现基于LRU算法缓存
一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...
随机推荐
- 转载- ACM常见的各种说法
from : http://blog.csdn.net/qq_15015129/article/details/52738184 1.答案错误 —— wrong answer 就是最常见的.这个没办法 ...
- Centos环境下,执行gulp,显示执行成功,但找到不生成的压缩文件
举例来说:以下是css文件夹下site.css文件为site.min.css,并且将生成的文件放在指定的目录下 //压缩站点css gulp.task('appallcss', function () ...
- 由angular命令行工具(angular-cli)生成的目录和文件
e2e目录:是端到端的测试目录,包含基本的测试桩.是用来做自动测试的. src:应用源代码目录.我们写的所有代码都应该在这里面. app:包括应用的组件和模块.我们自己写的绝大部分代码都是写在这个目录 ...
- 堆 Heap
2018-03-01 20:38:34 堆(Heap)是可以用来实现优先的队列的数据结构,而不是堆栈. 若采用数组或者链表实现优先队列 若采用树的结构 如果采用二叉搜索树,那么每次删除,比如删除最大值 ...
- 使用Bind读取配置到C#的实例
在之前的一篇二级域名绑定的文章<.Net Core 二级域名绑定到指定的控制器>中,有一个小的地方是关于读取Json文件的配置信息的,当时是用了读取文件流的方式,一直以来觉得该方法太Low ...
- JavaScript Browser 对象 实例
使用JavaScript来访问和控制浏览器对象实例. Window 对象 弹出一个警告框 弹出一个带折行的警告框 弹出一个确认框,并提醒访客点击的内容 弹出一个提示框 点击一个按钮时,打开一个新窗口 ...
- Android开发--List与ArrayList区别
List是一个接口,而ArrayList是一个类. ArrayList继承并实现了List. 所以List不能被构造,但可以向上面那样为List创建一个引用,而ArrayList就可以被构造. ...
- customs event
// First create the event var myEvent = new CustomEvent("userLogin", { detail: { username: ...
- 捕获enter键盘事件绑定到登录按钮
/** *捕获enter键盘事件绑定到登录按钮 */ function keyLogin(event) { if (event.keyCode == 13) { document.getElement ...
- 【转】c++析构函数(Destructor)
创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存.关闭打开的文件等,这个函数就是析构函数. 析构函数(Destructor)也 ...