您的位置:首页 > 其它

bzoj 1206: [HNOI2005]虚拟内存

2014-02-01 16:56 239 查看
用一个结构体来存储每一页的标号,访问次数和进入内存时间

然后用堆来弄这些东西。

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

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

记得要离散化!!

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
#define N 1000008

struct page
{
int num,v,t;
bool operator <(const page &b) const
{if (v == b.v) return (t > b.t); return (v > b.v);}
page(int n1,int v1,int t1){num = n1; v = v1; t = t1;}
};

int n,m,delta
,ans,s
,a
,b
;
bool at
;
priority_queue<page> Q;

bool cmp(int x,int y)
{
return (a[x] < a[y]);
}

void init()
{
scanf("%d%d",&n,&m);
for (int i = 1;i <= m;i++) scanf("%d",&a[i]),s[i] = i;//输入
sort(&s[1],&s[m+1],cmp);
for (int i = 1;i <= m;i++)
b[s[i]] = (a[s[i]] == a[s[i-1]]?b[s[i-1]]:b[s[i-1]]+1);//离散化
}

int main()
{
//    freopen("input.txt","r",stdin);

init();
for (int i = 1;i <= m;i++)
{
int k = b[i];
if (at[k]) delta[k]++,ans++;
else
{
if (Q.size() == n)
while (1)
{
page x = Q.top();
Q.pop(); at[x.num] = false;
if (!delta[x.num]) break ;
x.v += delta[x.num],delta[x.num] = 0;
if (Q.empty() || Q.top() < x) break ;
Q.push(x); at[x.num] = true;
}
Q.push(page(k,1,i)); at[k] = true;
}
}
printf("%d\n",ans);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: