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

先离散化虚拟内存页,然后用堆来维护最小查询次数,又因为次数相同时还要比较时间,所以我们把次数乘以(m+1)再加上时间,就可以了

 const
maxn=;
maxm=;
var
n,m,tot,time,ans:longint;
q:array[..maxn]of longint;
a,b,c,h:array[..maxm]of longint;
flag:array[..maxm]of int64; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint);
var
i,j,z:longint;
begin
i:=l;
j:=r;
z:=a[(l+r)>>];
repeat
while a[i]<z do
inc(i);
while a[j]>z do
dec(j);
if i<=j then
begin
swap(a[i],a[j]);
swap(b[i],b[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end; procedure init;
var
i:longint;
begin
read(n,m);
for i:= to m do
begin
read(a[i]);
b[i]:=i;
end;
sort(,m);
for i:= to m do
if a[i]<>a[i-] then c[b[i]]:=i
else c[b[i]]:=c[b[i-]];
end; procedure down(x:longint);
var
i:longint;
begin
i:=x<<;
while i<=tot do
begin
if (flag[q[i+]]<flag[q[i]])and(i<tot) then inc(i);
if flag[q[x]]>flag[q[i]] then
begin
swap(q[i],q[x]);
h[q[i]]:=i;
h[q[x]]:=x;
x:=i;
i:=x<<;
end
else break;
end;
end; procedure up(x:longint);
var
i:longint;
begin
while x> do
begin
i:=x>>;
if flag[q[i]]>flag[q[x]] then
begin
swap(q[i],q[x]);
h[q[i]]:=i;
h[q[x]]:=x;
x:=i;
end
else break;
end;
end; procedure insert(x:longint);
begin
inc(tot);
h[x]:=tot;
q[tot]:=x;
flag[x]:=time+m+;
up(tot);
end; procedure delete;
begin
flag[q[]]:=;
swap(q[],q[tot]);
h[q[]]:=;
h[q[tot]]:=;
dec(tot);
down();
end; procedure work;
var
i,j:longint;
begin
for i:= to m do
begin
inc(time);
{for j:=1 to m do
write(flag[j],' ');
writeln;
for j:=1 to m do
write(h[j],' ');
writeln;}
if flag[c[i]]<> then
begin
inc(ans);
inc(flag[c[i]],m+);
down(h[c[i]]);
end
else
if tot<n then insert(c[i])
else
begin
delete;
insert(c[i]);
end;
end;
write(ans);
end; begin
init;
work;
end.

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

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1206 题意: 内存大小为n(外存无限大),共有m次访问,每一次访问的信息编号为p. 对于每 ...

  2. BZOJ1206:[HNOI2005]虚拟内存

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

  3. 1200: [HNOI2005]木梳 - BZOJ

    Description   Input 第一行为整数L,其中4<=L<=100000,且有50%的数据满足L<=104,表示木板下侧直线段的长.第二行为L个正整数A1,A2,…,AL ...

  4. BZOJ-1206 虚拟内存 Hash+离散化+Priority_Queue

    闻说HNOI每年都有一道Hash. 1206: [HNOI2005]虚拟内存 Time Limit: 50 Sec Memory Limit: 162 MB Submit: 330 Solved: 2 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

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

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

  7. 【BZOJ】【1202】【HNOI2005】狡猾的商人

    Orz iwtwiioi  http://www.cnblogs.com/iwtwiioi/p/3887617.html 并查集+前缀和 啊……这题应该是水题吧?但是我这个大沙茶居然一天都没想出来…… ...

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

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

  9. bzoj 1200: [HNOI2005]木梳 DP

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

随机推荐

  1. 【AngularJs】---实现select的ng-options

    controller .controller('MainController', function($scope, $http, $ionicModal, $timeout) { var post = ...

  2. Apache配置多端口多站点

    配置httpd.conf 监听多个端口 复制代码 代码如下:# Listen: Allows you to bind Apache to specific IP addresses and/or # ...

  3. oracle 所有下级

    --所有下级 SELECT SAP_ORGAN_CODE FROM SAP_ORGAN_LEVEL CONNECT BY PRIOR SAP_FATHER_ORGAN_CODE= SAP_ORGAN_ ...

  4. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  5. asterisk 语音文件转换

    Centos wav to sln sox foo-in.wav -t raw -r 8000 -s -2 -c 1 foo-out.sln 当前目录下所有语音wav文件 转换成sln for a i ...

  6. Caching和Purgeable Memory (译)

    Caching和Purgeable Memory对于开发者来说是一个至关重要的资源,尤其是当我们需要处理那些需要超大内存以及计算时间的对象或者是当计算机向磁盘写入数据时导致应用程序陷入停滞时特别有用处 ...

  7. Php 输出语句

    输出语句 echo 示例: print(); 示例: 只能输出标量数据类型,无法输出布尔false print_r(); print_r可以以比较容易理解的方式显示数据 示例: var_dump(); ...

  8. Win7设置共享文件夹

    在系统中,实现共享的前提是,双方要在同一个局域网内,同一个工作组或者域内. 添加共享用户 点击确定即可,最好把共享的权限设置为只读类型,方便管理. 可以使用计算机的用户名或者IP地址来访问 如果还是不 ...

  9. bzoj 1040 骑士

    这题真不爽,各种WA,写个题解浏览器还挂了,真不爽. 所以不多说了,就说关于判断是否是父节点的问题,不能直接判,会有重边,这种情况只能用编号判,传进去入边的编号,(k^1) != fa,这样就可以了. ...

  10. ASP.NET Web API标准的“管道式”设计

    详见:http://www.cnblogs.com/artech/p/asp-net-web-api-pipeline.html http://www.codeproject.com/Articles ...