首页 > 其他 > 详细

bzoj 1206: [HNOI2005]虚拟内存

时间:2014-02-02 16:22:57      阅读:431      评论:0      收藏:0      [点我收藏+]

用一个结构体来存储每一页的标号,访问次数和进入内存时间

然后用堆来弄这些东西。

在堆外开一个at数组判是否在内存里面,开一个delta数组用作懒标记存储访问次数的变更

然后在一个外存里的东西要入内存时进行判断和懒标记的加入。。

记得要离散化!!

bubuko.com,布布扣
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <queue>
 6 using namespace std;
 7 #define N 1000008
 8 
 9 struct page
10 {
11     int num,v,t;
12     bool operator <(const page &b) const
13         {if (v == b.v) return (t > b.t); return (v > b.v);}
14     page(int n1,int v1,int t1){num = n1; v = v1; t = t1;}
15 };
16 
17 int n,m,delta[N],ans,s[N],a[N],b[N];
18 bool at[N];
19 priority_queue<page> Q;
20 
21 bool cmp(int x,int y)
22 {
23     return (a[x] < a[y]);
24 }
25 
26 void init()
27 {
28     scanf("%d%d",&n,&m);
29     for (int i = 1;i <= m;i++) scanf("%d",&a[i]),s[i] = i;//输入 
30     sort(&s[1],&s[m+1],cmp);
31     for (int i = 1;i <= m;i++) 
32         b[s[i]] = (a[s[i]] == a[s[i-1]]?b[s[i-1]]:b[s[i-1]]+1);//离散化 
33 }
34 
35 int main()
36 {
37 //    freopen("input.txt","r",stdin);
38     
39     init();
40     for (int i = 1;i <= m;i++)
41     {
42         int k = b[i];
43         if (at[k]) delta[k]++,ans++;
44         else 
45         {
46             if (Q.size() == n)
47                 while (1)
48                 {
49                     page x = Q.top();
50                     Q.pop(); at[x.num] = false;
51                     if (!delta[x.num]) break ;
52                     x.v += delta[x.num],delta[x.num] = 0;
53                     if (Q.empty() || Q.top() < x) break ;
54                     Q.push(x); at[x.num] = true;
55                 }
56             Q.push(page(k,1,i)); at[k] = true;
57         }
58     }
59     printf("%d\n",ans);
60     return 0;
61 }
View Code

bzoj 1206: [HNOI2005]虚拟内存

原文:http://www.cnblogs.com/wulala979/p/3537031.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!