UVA 11423 - Cache Simulator (树状数组)

option=com_onlinejudge&Itemid=8&category=523&page=show_problem&problem=2418" style="">题目链接

题目大意:模仿磁盘缓冲区的工作机制,给你n个不同size的(递增的)磁盘缓冲区。给你要訪问的数据,依据LRU原则,问每一个size的磁盘分别有多少次miss(数据没有在缓存中就是miss)。

解题思路:由于数据最多有10^7,所以数据訪问的序列最长也就是10^7。

树状数组的每一个位置代表的是訪问序列的位置有没有数,由于假设之前的数在后面有訪问到的话,那么这个数就应该在后面了,这样前面的那个数就应该不存在。

做法:先将要訪问的数据序列处理出来,放在队列中,而且找到每一个数之前出现过的离它近期的那个位置。查询当前的位置和之前那个出现的位置之间有多少个数(假设dis个);小于dis的cache的miss++,然后要记得删除树状数组之前的那个位置上的值。

假设是没有出现过的数,那么miss肯定是要+1的。

注意:每次state都要又一次计算miss。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map> using namespace std; const int N = 35;
const int maxn = 1e7 + 5;
#define lowbit(x) ((x)&(-x)) int n;
int Miss[N], Cache[N];
int C[maxn];
char str[N]; void add (int x, int v) {
while (x < maxn) { C[x] += v;
x += lowbit(x);
}
} int sum (int x) {
int ret = 0;
while (x > 0) { ret += C[x];
x -= lowbit(x);
}
return ret;
} struct Num {
int value, pre;
Num (int value , int pre) {
this->value = value;
this->pre = pre;
}
};
queue<Num> Q;
map<int, int> vis; void init () { int b, y, k;
memset (Miss, 0, sizeof(Miss));
vis.clear();
while (scanf ("%s", str) && str[0] != 'E') { if (str[0] == 'R') {
scanf ("%d%d%d" , &b, &y, &k);
for (int i = 0; i < k; i++) {
Q.push(Num(b + y * i, vis[b + y * i]));
vis[b + y * i] = Q.size();
}
} else if (str[0] == 'A') {
scanf ("%d", &b);
Q.push(Num (b, vis[b]));
vis[b] = Q.size();
} else {
Q.push(Num (-1, 0));
}
}
} void solve () { init();
memset (C, 0, sizeof (C));
int cnt = 0;
while (!Q.empty()) { if (Q.front().value >= 0) { add(cnt + 1, 1);
if (Q.front().pre > 0) { int dis = sum(cnt + 1) - sum(Q.front().pre);
// printf ("%d %d %d %d\n", Q.front().value, cnt + 1, Q.front().pre, dis);
for (int i = 0; i < n; i++) {
if (Cache[i] < dis)
Miss[i]++;
else
break;
}
add(Q.front().pre, -1);
} else {
for (int i = 0; i < n; i++)
Miss[i]++;
}
} else {
for (int i = 0; i < n - 1; i++)
printf ("%d ", Miss[i]);
printf ("%d\n", Miss[n - 1]);
memset (Miss, 0, sizeof (Miss));
}
Q.pop();
cnt++;
}
} int main () { scanf ("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &Cache[i]); solve();
return 0;
};

UVA 11423 - Cache Simulator (树状数组)的更多相关文章

  1. UVA 1513 - Movie collection(树状数组)

    UVA 1513 - Movie collection option=com_onlinejudge&Itemid=8&page=show_problem&category=5 ...

  2. Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)

    Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...

  3. UVA 1428 - Ping pong(树状数组)

    UVA 1428 - Ping pong 题目链接 题意:给定一些人,从左到右,每一个人有一个技能值,如今要举办比赛,必须满足位置从左往右3个人.而且技能值从小到大或从大到小,问有几种举办形式 思路: ...

  4. uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1

    Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General ...

  5. UVA 11525 Permutation (树状数组+YY)

    题意:给你k个数Si,然后给你一个等式   H= ∑  Si ∗ (K − i)!  (i=(1->k)且0 ≤ Si ≤ K − i). 叫你求出第H个全排列 其实这是一个康托展开:X=a[n ...

  6. UVA - 1471 Defense Lines 树状数组/二分

                                  Defense Lines After the last war devastated your country, you - as the ...

  7. UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  8. UVA 1513 Movie collection (树状数组+反向存储)

    题意:给你n盘歌碟按照(1....n)从上到下放,接着m个询问,每一次拿出x碟,输出x上方有多少碟并将此碟放到开头 直接想其实就是一线段的区间更新,单点求值,但是根据题意我们可以这样想 首先我们倒着存 ...

  9. UVA 11610 Reverse Prime (数论+树状数组+二分,难题)

    参考链接http://blog.csdn.net/acm_cxlove/article/details/8264290http://blog.csdn.net/w00w12l/article/deta ...

随机推荐

  1. C/C++ char*、char[]

    一.本质区别 char* s是一个保存字符串首地址的指针变量,char a[]是许多连续的内存单元,单元中的元素为char类型.之所以用char *能达到char []的效果,还是字符串的本质,即给你 ...

  2. GEO/SRA数据库

    GEO数据库 GEO数据库隶属于NCBI,是最大最全面的基因表达数据库,主要是芯片和转录组测序数据.除储存数据外,也提供一些数据挖掘工具,因此利用好这个数据库,没有实验,没有自己的数据也能发好文章! ...

  3. Python自学-2-python解释器

    写python源文件,以.py为后缀名 用python解释器去执行.py文件 python解释器 CPython:官方版本,由C语言开发的,下载默认就是这个,使用最广的解释器.   用>> ...

  4. UVA - 1608 Non-boring sequences(分治法)

    题目: 如果一个序列的任意连续的子序列中至少有一个只出现一次的元素,则称这个序列是不无聊的.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是不是不无聊的. 思 ...

  5. Semi-colon expected (eclipse 引入 json文件报错)

    最近做的项目用到的前端框架有一个json文件夹,里面全是json文件,所以导入Eclipse的时候会在整个项目上都是红叉,但是其实不影响项目运行的,之前忙着码代码也没时间管他,这个红叉存留了一个月!今 ...

  6. shell日志颜色处理

    记录一下shell日志颜色处理 _COLORS=${BS_COLORS:-$(tput colors >/dev/)} __detect_color_support() { # shellche ...

  7. 作为一个程序员,分享一下我自己常用的几款非常方便的chrome插件

    作为一名资深码农,结合身边一群IT民工的真实体验,小编有那么一点权威给各位推荐几款程序员必备.常用的chrome扩展插件. 1.Click&Clean Click&Clean插件可以监 ...

  8. python+pyqt5实现24点小游戏

    本文实例为大家分享了python实现24点游戏的具体代码,供大家参考,具体内容如下 描述:一副牌中A.J.Q.K可以当成是1.11.12.13.任意抽取4张牌,用加.减.乘.除(可加括号)把牌面上的数 ...

  9. 负载均衡之Ocelot+Consul(WebAPI注册服务)

    上一篇   负载均衡之Ocelot+Consul(文件配置注册服务),介绍了如何通过json文件注册服务,本篇将学习如何通过web api 注册服务. 在展开学习过程之前,且先总结一下 consul服 ...

  10. IOC控制反转之Autofac

    https://www.jianshu.com/p/1b6cb076e2e5 博主:衡泽_徐峰 Autofac官网:https://autofac.org/ Autofac 是.Net非常好的一个IO ...