UVA 11423 - Cache Simulator (树状数组)
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 (树状数组)的更多相关文章
- UVA 1513 - Movie collection(树状数组)
UVA 1513 - Movie collection option=com_onlinejudge&Itemid=8&page=show_problem&category=5 ...
- Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)
Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...
- UVA 1428 - Ping pong(树状数组)
UVA 1428 - Ping pong 题目链接 题意:给定一些人,从左到右,每一个人有一个技能值,如今要举办比赛,必须满足位置从左往右3个人.而且技能值从小到大或从大到小,问有几种举办形式 思路: ...
- uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1
Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General ...
- UVA 11525 Permutation (树状数组+YY)
题意:给你k个数Si,然后给你一个等式 H= ∑ Si ∗ (K − i)! (i=(1->k)且0 ≤ Si ≤ K − i). 叫你求出第H个全排列 其实这是一个康托展开:X=a[n ...
- UVA - 1471 Defense Lines 树状数组/二分
Defense Lines After the last war devastated your country, you - as the ...
- UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVA 1513 Movie collection (树状数组+反向存储)
题意:给你n盘歌碟按照(1....n)从上到下放,接着m个询问,每一次拿出x碟,输出x上方有多少碟并将此碟放到开头 直接想其实就是一线段的区间更新,单点求值,但是根据题意我们可以这样想 首先我们倒着存 ...
- UVA 11610 Reverse Prime (数论+树状数组+二分,难题)
参考链接http://blog.csdn.net/acm_cxlove/article/details/8264290http://blog.csdn.net/w00w12l/article/deta ...
随机推荐
- Windows Server 2008不能Ping改为允许的方法
用了Windows Server 2008朋友肯定都知道,2008在很多设置方面与2003不同,尤其在安全上进行了加强,例如:默认情况下Windows 2008是不允许PING的,那么如何打开允许PI ...
- linux环境下为php7装phpredis扩展
phpredis在php7.php5下都有不同的版本,装岔了可能会编译报错,所以在安装之前请先看下自己的php是啥版本. 我的redis装的是redis3.2.3版本. 用phpinfo()查看安装的 ...
- EF 迁移操作
一. 模型设计 1. 遵循EF标准,注意表关系配对 2. 数据模型里尽量把必须的属性和说明都写全 3. EF默认id字段为主键,如果没有,需指定主键 二. 数据迁移 1. 命令运行环境:vis ...
- Spring框架系列(七)--Spring常用注解
Spring部分: 1.声明bean的注解: @Component:组件,没有明确的角色 @Service:在业务逻辑层使用(service层) @Repository:在数据访问层使用(dao层) ...
- SSH命令行传输文件到远程服务器
Ubuntu操作系统 SCP命令 使用方式如下: 1.上传本地文件到远程服务器 scp /var/www/test.php root@192.168.0.101:/var/www/ 把本机/var/w ...
- uploadify的简单使用
简单的图片上传: 1.进入官网下载uploadify插件:http://www.uploadify.com/download/ 2.导入uploadify插件提供的css样式和类库: <link ...
- C: 当字符数组首指针转化成char *指针,sizeof(*ptr)不为array的size
#include <stdio.h> #include <string.h> int main() { char a[10] = "\0"; char *p ...
- zabbix+docker
由于公司线上服务器数量太少,又要用于生产,领导让上zabbix,但熟知zabbix搭建需要LAMP或者LNMP,如果和生产服务器混搭的话,不方便管理,也怕出问题,所以就先使用docker方式搭建管理. ...
- PAT 1139 First Contact
Unlike in nowadays, the way that boys and girls expressing their feelings of love was quite subtle i ...
- Prüfer序列和cayley定理
参考资料: 1.matrix67 <经典证明:Prüfer编码与Cayley公式> 2.百度百科 3.Forget_forever prufer序列总结 4.维基百科 5.dirge的学习 ...