bzoj 1206: [HNOI2005]虚拟内存
2014-02-01 16:56
239 查看
用一个结构体来存储每一页的标号,访问次数和进入内存时间
然后用堆来弄这些东西。
在堆外开一个at数组判是否在内存里面,开一个delta数组用作懒标记存储访问次数的变更
然后在一个外存里的东西要入内存时进行判断和懒标记的加入。。
记得要离散化!!
View Code
然后用堆来弄这些东西。
在堆外开一个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
相关文章推荐
- BZOJ 1206 [HNOI2005] 虚拟内存 题解与分析
- BZOJ 1206 [HNOI2005] 虚拟内存 题解
- BZOJ 1206 [HNOI2005] 虚拟内存 题解与分析
- 【BZOJ1206】【HNOI2005】虚拟内存,我也就能写写这种模拟题了
- [BZOJ]1206: [HNOI2005]虚拟内存 线段树
- BZOJ 1206: [HNOI2005]虚拟内存
- 1206: [HNOI2005]虚拟内存 - BZOJ
- bzoj1206 [HNOI2005]虚拟内存
- bzoj 1206: [HNOI2005]虚拟内存
- bzoj 1206: [HNOI2005]虚拟内存
- 1200: [HNOI2005]木梳 - BZOJ
- BZOJ 1200: [HNOI2005]木梳
- BZOJ 1202 HNOI2005 狡猾的商人 并查集
- bzoj1202: [HNOI2005]狡猾的商人(带权并查集)
- BZOJ 1202: [HNOI2005]狡猾的商人(并查集)
- bzoj千题计划176:bzoj1199: [HNOI2005]汤姆的游戏
- 【BZOJ1202】【HNOI2005】狡猾的商人
- [HNOI2005]虚拟内存
- 【bzoj1202】 HNOI2005—狡猾的商人
- BZOJ 1202: [HNOI2005]狡猾的商人【并查集】【路径迭代】