bzoj1206 [HNOI2005]虚拟内存
2018-01-07 10:55
176 查看
http://www.elijahqi.win/2018/01/07/bzoj1206-hnoi2005%e8%99%9a%e6%8b%9f%e5%86%85%e5%ad%98/
Description
操作系统中一种重要的存储管理技术就是虚拟内存技术。操作系统中允许进程同时运行,也就是并行。每个进程都有其相对独立的数据块(进程运行的过程中将对其进行读写操作)。理想的情况下,这些数据块都应该存放在内存中,这样才能实现高效的读写操作。但事实上,内存的容量有限,每个进程只能把一部分数据放在内存中,为了解决这个矛盾,提出了虚拟内存技术。虚拟内存技术的基本原理是:对进程而言,内存空间是无限大的,进程可以随意地读写数据,而对操作系统内部而言,利用外存来模拟扩充的内存空间,进程要求访问某个内存单元时,交由操作系统处理,操作系统首先在内存中查找该单元是否存在,如果存在,查找成功,否则转入外存查找(一定存在于外存中)。就存储介质的物理性质而言,内存的访问速度相对于外存要快得多,因此对于每个进程来说操作系统应该把那些访问次数较多的数据存放在内存中,而把那些访问次数很少的数据放在外存中。如何选择内存中暂留的数据是一个很值得研究的问题,下面介绍一个内存管理中比较常用的算法:内存中的数据以页为基本存储单位,进程的读写操作都针对页来进行。实际内存空间被分割成n页,虚拟内存空间的页数往往要多得多。某一时刻,进程需要访问虚存编号为P的页,该算法的执行步骤如下: a. 首先在内存中查找,如果该页位于内存中,查找成功,转d,否则继续下面的操作; b. 寻找内存中是否存在空页(即没有装载任何数据页的页面),若有,则从外存中读入要查找页,并将该页送至内存中的空页进行存储,然后转d,否则继续下面的操作; c. 在内存中寻找一个访问次数最少的页面(如果存在多个页面的访问次数同时为最少,则选取最早读入数据进入内存的那个页面),从外存中读入要查找页,替换该页。 d. 结束所谓访问次数是指从当前页面进入内存到该时刻被访问的次数,如果该页面以前进入过内存并被其它页面替换,那么前面的访问次数不应计入这个时刻的访问次数中。你的任务是设计一个程序实现上述算法。测试数据将会提供m条读写内存的命令,每条命题提供要求访问的虚拟内存页的编号P。你的程序要求能够模拟整个m条命令的全部执行过程,所有的命令是按照输入的先后执行的,最开始的时候内存中的n页全为空。
Input
第1行为n<10000和m<1000000,分别表示内存页数和读写内存命令条数。接下来有m行,其中第i+1行有一个正整数Pi<=10^9,表示第i条读写内存命令需要访问的虚拟内存页的编号。
Output
仅包含一个正整数,表示在整个模拟过程中,在内存中直接查找成功的次数(即上面的算法只执行步骤a的次数)。
Sample Input
3 8
1
1
2
3
4
2
5
4
Sample Output
1
今天早晨起来忽然看到以前一个没有写过的题 改了改
做法呢就是纯模拟 用一个map来离散化 然后priority_queue用来把我访问次数最少的找出来 做了个优化就是如果以前存在那么我就先不去改动 当空间满了需要去弹出的时候我再依次把所有的都更新正确了 然后再决定弹哪个内存
Description
操作系统中一种重要的存储管理技术就是虚拟内存技术。操作系统中允许进程同时运行,也就是并行。每个进程都有其相对独立的数据块(进程运行的过程中将对其进行读写操作)。理想的情况下,这些数据块都应该存放在内存中,这样才能实现高效的读写操作。但事实上,内存的容量有限,每个进程只能把一部分数据放在内存中,为了解决这个矛盾,提出了虚拟内存技术。虚拟内存技术的基本原理是:对进程而言,内存空间是无限大的,进程可以随意地读写数据,而对操作系统内部而言,利用外存来模拟扩充的内存空间,进程要求访问某个内存单元时,交由操作系统处理,操作系统首先在内存中查找该单元是否存在,如果存在,查找成功,否则转入外存查找(一定存在于外存中)。就存储介质的物理性质而言,内存的访问速度相对于外存要快得多,因此对于每个进程来说操作系统应该把那些访问次数较多的数据存放在内存中,而把那些访问次数很少的数据放在外存中。如何选择内存中暂留的数据是一个很值得研究的问题,下面介绍一个内存管理中比较常用的算法:内存中的数据以页为基本存储单位,进程的读写操作都针对页来进行。实际内存空间被分割成n页,虚拟内存空间的页数往往要多得多。某一时刻,进程需要访问虚存编号为P的页,该算法的执行步骤如下: a. 首先在内存中查找,如果该页位于内存中,查找成功,转d,否则继续下面的操作; b. 寻找内存中是否存在空页(即没有装载任何数据页的页面),若有,则从外存中读入要查找页,并将该页送至内存中的空页进行存储,然后转d,否则继续下面的操作; c. 在内存中寻找一个访问次数最少的页面(如果存在多个页面的访问次数同时为最少,则选取最早读入数据进入内存的那个页面),从外存中读入要查找页,替换该页。 d. 结束所谓访问次数是指从当前页面进入内存到该时刻被访问的次数,如果该页面以前进入过内存并被其它页面替换,那么前面的访问次数不应计入这个时刻的访问次数中。你的任务是设计一个程序实现上述算法。测试数据将会提供m条读写内存的命令,每条命题提供要求访问的虚拟内存页的编号P。你的程序要求能够模拟整个m条命令的全部执行过程,所有的命令是按照输入的先后执行的,最开始的时候内存中的n页全为空。
Input
第1行为n<10000和m<1000000,分别表示内存页数和读写内存命令条数。接下来有m行,其中第i+1行有一个正整数Pi<=10^9,表示第i条读写内存命令需要访问的虚拟内存页的编号。
Output
仅包含一个正整数,表示在整个模拟过程中,在内存中直接查找成功的次数(即上面的算法只执行步骤a的次数)。
Sample Input
3 8
1
1
2
3
4
2
5
4
Sample Output
1
今天早晨起来忽然看到以前一个没有写过的题 改了改
做法呢就是纯模拟 用一个map来离散化 然后priority_queue用来把我访问次数最少的找出来 做了个优化就是如果以前存在那么我就先不去改动 当空间满了需要去弹出的时候我再依次把所有的都更新正确了 然后再决定弹哪个内存
#include<cstdio> #include<queue> #include<map> #define N 1100000 using namespace std; int p,n,m,tot,flag ; map <int,int> ma; inline char gc(){ static char now[1<<16],*S,*T; if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;} return *S++; } inline int read(){ int x=0;char ch=gc(); while (ch<'0'||ch>'9') ch=gc(); while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();} return x; } struct node{ int num,happen,dis;//num 输入顺序 happen 访问次数 dis离散化对应的值 bool operator > (const node &other) const{ if (happen<other.happen) return false; if (happen>other.happen) return true; return num>other.num; } }x; priority_queue <node,vector<node>,greater<node> > team;//定义了复杂类型的优先队列 int main(){ // freopen("2318.in","r",stdin); // freopen("2318.out","w",stdout); n=read();m=read();int ans=0; for (int i=1;i<=m;++i){ p=read();int k=0; if (!ma[p]){ ma[p]=++tot;k=tot; }else k=ma[p]; flag[k]++; if (flag[k]>1){ans++;continue;} x.happen=1;x.num=i;x.dis=k; if (team.size()!=n) {team.push(x);continue;} node y=team.top(); while (y.happen!=flag[y.dis]){ team.pop(); y.happen=flag[y.dis]; //修改team中 happen成为真实值 team.push(y); y=team.top(); } flag[y.dis]=0;team.pop();team.push(x); } printf("%d",ans); return 0; }
相关文章推荐
- 【BZOJ1206】【HNOI2005】虚拟内存,我也就能写写这种模拟题了
- 1206: [HNOI2005]虚拟内存 - BZOJ
- BZOJ 1206: [HNOI2005]虚拟内存
- bzoj 1206: [HNOI2005]虚拟内存
- [BZOJ]1206: [HNOI2005]虚拟内存 线段树
- BZOJ 1206 [HNOI2005] 虚拟内存 题解与分析
- BZOJ 1206 [HNOI2005] 虚拟内存 题解
- bzoj 1206: [HNOI2005]虚拟内存
- bzoj 1206: [HNOI2005]虚拟内存
- BZOJ 1206 [HNOI2005] 虚拟内存 题解与分析
- [bzoj 1202--HNOI2005]狡猾的商人
- bzoj千题计划176:bzoj1199: [HNOI2005]汤姆的游戏
- BZOJ 1201: [HNOI2005]数三角形
- [BZOJ1202][HNOI2005]狡猾的商人(并查集)
- bzoj1202: [HNOI2005]狡猾的商人
- BZOJ 1202: [HNOI2005]狡猾的商人(并查集)
- BZOJ1202 [HNOI2005]狡猾的商人 并查集维护前缀和
- [BZOJ1202][HNOI2005]狡猾的商人(并查集+前缀和)
- BZOJ4010【HNOI2005】菜肴制作
- 【BZOJ 1202】【HNOI 2005】 狡猾的商人