题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1206

题意:

  内存大小为n(外存无限大),共有m次访问,每一次访问的信息编号为p。

  对于每一条信息,不在内存中,就在外存中。

  内存和外存的访问速度不同。为了提高整体的访问速度,有这样一种内存管理的算法:

    (1)如果p在内存中,直接访问,算法结束。否则转步骤(2)。

    (2)如果内存有剩余空间,则将p由外存转移到内存中来,算法结束。否则转步骤(3)。

    (3)选出内存中访问次数最少的一条信息(访问次数相同选进入内存时间早的),用p将它替换掉,算法结束。

  访问次数是指:某条信息从进入内存的那一刻开始一直到现在的访问次数。(如果之前进入过内存,然后又被替换掉了,那么之前的访问次数不算)

  问你在内存中直接访问到p的次数。(即执行步骤(1)的次数)

题解:

  模拟。

  用STL中map和set神器~~~

  map映射:p的编号idx -> (p的访问次数cnt, p进入内存的时间tim)

  set:(idx, cnt, tim) 排序优先级:先cnt,后tim。(均取小)

  map用来查询p是否在内存中,以及有关p的信息(以便在set中定位到相应元素)

  set用来作优先队列(可任意插入和删除元素),队首为内存中访问次数最少(或进入内存最早)的一条信息。

  map和set分别保证了在log(N)时间内的查找和删除(替换)信息。

  总复杂度为O(m * log(n))。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <map>
#include <set> using namespace std; struct Pro
{
int idx;
int cnt;
int tim;
Pro(int _idx,int _cnt,int _tim)
{
idx=_idx;
cnt=_cnt;
tim=_tim;
}
Pro(){}
friend bool operator < (const Pro &a,const Pro &b)
{
return a.cnt!=b.cnt?a.cnt<b.cnt:a.tim<b.tim;
}
}; int n,m,p;
int ans=;
map<int,pair<int,int> > mp;
set<Pro> st; int main()
{
cin>>n>>m;
for(int i=;i<m;i++)
{
cin>>p;
map<int,pair<int,int> >::iterator it_mp=mp.find(p);
if(it_mp!=mp.end())
{
int cnt=(it_mp->second).first;
int tim=(it_mp->second).second;
st.erase(Pro(p,cnt,tim));
st.insert(Pro(p,cnt+,tim));
mp[p]=pair<int,int>(cnt+,tim);
ans++;
}
else if(mp.size()<n)
{
mp.insert(pair<int,pair<int,int> >(p,pair<int,int>(,i)));
st.insert(Pro(p,,i));
}
else
{
set<Pro>::iterator it_st=st.begin();
int idx=it_st->idx;
int cnt=it_st->cnt;
int tim=it_st->tim;
mp.erase(idx);
st.erase(it_st);
mp.insert(pair<int,pair<int,int> >(p,pair<int,int>(,i)));
st.insert(Pro(p,,i));
}
}
cout<<ans<<endl;
}

BZOJ 1206 [HNOI2005]虚拟内存:模拟的更多相关文章

  1. 1206: [HNOI2005]虚拟内存 - BZOJ

    Description 操作系统中一种重要的存储管理技术就是虚拟内存技术.操作系统中允许进程同时运行,也就是并行.每个进程都有其相对独立的数据块(进程运行的过程中将对其进行读写操作).理想的情况下,这 ...

  2. BZOJ1206:[HNOI2005]虚拟内存

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  3. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

  4. bzoj 1202: [HNOI2005]狡猾的商人 并查集好题

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2946  Solved: 1384[Submit][Sta ...

  5. BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力

    1199: [HNOI2005]汤姆的游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  6. bzoj 1200: [HNOI2005]木梳 DP

    1200: [HNOI2005]木梳 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 266  Solved: 125[Submit][Status] ...

  7. bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] ...

  8. BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )

    好像很多人用并查集写的... 前缀和, 则 sumt - sums-1 = v, 拆成2条 : sumt ≤ sums-1 + v, sums-1 ≤ sumt - v 就是一个差分约束, 建图跑SP ...

  9. bzoj 1201[HNOI2005]数三角形 1202 [HNOI2005]狡猾的商人 暴力 权值并查集

    [HNOI2005]数三角形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 349  Solved: 234[Submit][Status][Disc ...

随机推荐

  1. vue2.0 watch 详解

    vue官网解释: 一个对象,键是需要观察的表达式,值是对应回调函数.值也可以是方法名,或者包含选项的对象.Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性. 也就是 ...

  2. UDP通信注意事项

    今天调试UDP,笔记本上面可以实现但台式机上面竟然无法通信,后来找了半天,原来是权限问题.必须将用户权限设置为最低才行. 在运行里面输入UAC (user access control )用户权限设置 ...

  3. frame框架及其实例

    框架概念 : 谓框架便是网页画面分成几个框窗,同时取得多个 URL.只需要 <FRAMESET> <FRAME> 即可,面所有框架标记需要放在一个总起的 html 档,这个档案 ...

  4. Oracle 使用TRUNCATE TABLE删除所有行

    若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速.有效的方法.TRUNCATE TABLE 与不含 WHERE 子句的 DELETE 语句类似.但是,TRUNCATE TABLE ...

  5. Oracle中没有 if exists(...)的解决方法

    http://blog.csdn.net/hollboy/article/details/7550171对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常 ...

  6. 怎么样自己动手写OS

    虽然我现在并不是从事内核方向,却本着探索计算机本质的想法学习的内核,自从写完这个内核以后真的发现对很多东西的理解都更深一层,所以专研内核,对我现在的工作是很有帮助的.我个人强烈建议师弟师妹们尽早地啃一 ...

  7. MagicalRecord使用教程【转载】

    原文地址:http://www.ithao123.cn/content-96403.html 下面是在xcode5.1下ARC环境中的使用教程 1. 将 MagicalRecord 文件夹拖入到工程文 ...

  8. 10个经典Java面试题

    1.Java的HashMap是怎样工作的? HashMap是一个针对数据结构的键值.每一个键都会有对应的值.关键是识别这种值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...

  9. Oracle -- 连接每行的内容

    select wm_concat(message) from (        select rownum no, 'Case ''' || code || '''' || '' || chr(10) ...

  10. React常用方法手记

    1.Reactjs 如何获取子组件的key值?请问antd中table自定义列render方法怎么获取当前第几列? https://segmentfault.com/q/101000000453235 ...