1. 闻说HNOI每年都有一道Hash

1206: [HNOI2005]虚拟内存

Time Limit: 50 Sec Memory Limit: 162 MB

Submit: 330 Solved: 202

[Submit][Status][Discuss]

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

HINT

Source

hash

  1. 这道题目,算是模拟吧,调的时候有一个点忘了,WA了两次,无果后,遂寻男神xym,他竟然用map!!!不过还是看出来了问题,也不算坑。

数据是10^9级的,但实际数量10^6级,所以想到离散;用堆维护,记录三个值:离散后的数值,访问次数,插入堆的顺序;当堆中多于n后,进行替换;值得一提的是要重载运算符(开始自己重载的有点丑,于是借鉴了男神的讨论打了个opreator)

有趣的是,在我调试的时候,电脑弹出了一个提示:



真机智QAQ

下面是代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. int nc[1000010];
  8. int n,m;
  9. int p[1000010],pi[1000010];
  10. int num=0;int cnt;
  11. int ans=0;
  12. struct data{
  13. int dat,tim,sx;//dat是表示值,tim表示访问次数,sx表示先后顺序
  14. bool operator > (const data &other) const
  15. {
  16. if (tim<other.tim) return 0;
  17. if (tim>other.tim) return 1;
  18. return sx>other.sx;
  19. }
  20. };
  21. priority_queue <data,vector<data>,greater<data> > q;
  22. //再开一个数组,专门存放在hash表里的位置
  23. int read()
  24. {
  25. int x=0,f=1;char ch=getchar();
  26. while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
  27. while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
  28. return x*f;
  29. }
  30. //查找内存,查找成功,结束,答案+1
  31. //查找失败,查找空页,有空页,插入空页中 结束
  32. //无空页,删除访问数最小的页,插入此页 结束
  33. bool cmp(int a,int b)
  34. {
  35. return a<b;
  36. }
  37. int erfen(int x)
  38. {
  39. int left=1,right=cnt;
  40. while (left<=right)
  41. {
  42. int mid=(left+right)>>1;
  43. if (p[mid]==x) return mid;
  44. if (p[mid]>x) right=mid-1;
  45. else left=mid+1;
  46. }
  47. }
  48. void lsh()
  49. {
  50. sort(p+1,p+m+1,cmp);
  51. cnt=1;
  52. for (int i=2; i<=m; i++)
  53. if (p[i]!=p[i-1]) p[++cnt]=p[i];
  54. for (int i=1; i<=m; i++)
  55. pi[i]=erfen(pi[i]);
  56. }
  57. int main()
  58. {
  59. n=read();m=read();
  60. for (int i=1; i<=m; i++)
  61. {p[i]=read();pi[i]=p[i];}
  62. lsh();
  63. for (int i=1; i<=m; i++)
  64. {
  65. int now=pi[i];
  66. int tmp;
  67. nc[now]++;
  68. if (nc[now]>1) {ans++;continue;}//command a.
  69. data x;
  70. x.dat=now,x.tim=1,x.sx=i;
  71. if (q.size()<n) {q.push(x);continue;}//command b.
  72. data y;
  73. y=q.top();
  74. while (y.tim!=nc[y.dat])
  75. {
  76. q.pop();
  77. y.tim=nc[y.dat];
  78. q.push(y);
  79. y=q.top();
  80. }
  81. nc[y.dat]=0;
  82. q.pop();q.push(x);//command c.
  83. }
  84. printf("%d\n",ans);
  85. return 0;
  86. }

BZOJ-1206 虚拟内存 Hash+离散化+Priority_Queue的更多相关文章

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

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

  2. 【BZOJ 3098】 Hash Killer II

    Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题:给你一个长度为N的字符串S,求有多少个不同的长度为L的子串.子串的定义是S[l].S[l + 1].... S ...

  3. BZOJ 1818 内部白点(离散化+树状数组)

    此题就是1227 的弱化版. 画个图或者稍微证明一下就能够知道,一定不会超过一次变换. 那么我们只需要统计有多少个白点会变黑,换句话说就是有多少个白点上下左右都有黑点. 离散化横坐标,因为没有黑点在的 ...

  4. BZOJ 1227 虔诚的墓主人(离散化+树状数组)

    题目中矩形的尺寸太大,导致墓地的数目太多,如果我们统计每一个墓地的虔诚度,超时是一定的. 而常青树的数目<=1e5.这启发我们从树的方向去思考. 考虑一行没有树的情况,显然这一行的墓地的虔诚度之 ...

  5. [Sdoi2013] [bzoj 3198] spring (hash+容斥原理)

    题目描述 给出nnn个666维坐标,求有多少对点对满足恰好mmm个位置相等 1<=n<=1051<=n<=10^51<=n<=105 0<=k<=60& ...

  6. bzoj 1067: [SCOI2007]降雨量 (离散化+线段树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1067 思路: 毒瘤题,写的自闭,改了一晚上,注意要理清题目的逻辑 x小于等于y,x,y之间的 ...

  7. BZOJ 2084 二分+hash OR Manacher

    思路: 二分+哈希 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> ...

  8. BZOJ 3357: [Usaco2004]等差数列

    3357: [Usaco2004]等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 338  Solved: 160[Submit][Statu ...

  9. 南阳理工 题目9:posters(离散化+线段树)

    posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 The citizens of Bytetown, AB, could not stand that ...

随机推荐

  1. nginx 一二事(2) - 创建虚拟静态服务器

    一.什么是nginx 是一个C语言开发的HTTP反向代理服务器,性能非常高 一个俄罗斯的哥们开发的,官方提供的测试性能能够达到5W的并发,我的天呐~,实际测试差不多是2W,而淘宝的牛人可以优化到200 ...

  2. Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  3. js常用宽高属性

    document.body.clientWidth //body对象的宽度 document.body.clientHeight //body对象的高度 document.documentElemen ...

  4. ArcGis 统计方法

    from:http://blog.sina.com.cn/s/blog_4177d50b0100fjbg.html 概述 一般常用的统计功能例如:唯一字段统计.数据行数统计.数据值求和统计等. 1.基 ...

  5. centos6.8部署vnc服务

    VNC全称是Virtual Network Computing,属于远程控制类软件.其优点是支持跨操作系统的远程图形化控制.在日常运维工作中,由于服务器常常是放在机房,我们不可能每次需要图形界面操作就 ...

  6. Javascript 中的 in, hasOwnProperty, delete, for/in

    in 运算符 判断对象是否拥有某一属性只要对象拥有该属性,就会返回true,否则false var point = { x:1, y:1 };alert( 'x' in point );  //tru ...

  7. 021医疗项目-模块二:药品目录的导入导出-介绍poi类

    我们使用的是.10版本 Apache POI - the Java API for Microsoft Documents,Apache POI 是用Java编写的免费开源的跨平台的 Java API ...

  8. Linux 守护进程一

    守护进程是一个后台进程,它无需用户输入就能运行,经常是提供某种服务. LInux作为服务器,主要的进程也都是为系统或用户提供后台服务功能. 常见的守护进程有Web服务器.邮件服务器以及数据库服务器等等 ...

  9. libevent+bufferevent总结

    libevent+bufferevent总结 1 学习参考网址 libevent学习网址:http://blog.csdn.net/feitianxuxue/article/details/93725 ...

  10. Ant 执行 YUICompressor

    Ant 执行 YUICompressor 任务压缩 JavaScript 和 CSS 文件,解决中文乱码问题,增加源文件字符编码集设定 标签: javascriptantcss任务encodingnu ...