Description

在计算机中,CPU只能和高速缓存Cache直接交换数据。当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache。此时,如果Cache容量已满,则必须先从中删除一个。
例如,当前Cache容量为3,且已经有编号为10和20的主存单元。 此时,CPU访问编号为10的主存单元,Cache命中。
接着,CPU访问编号为21的主存单元,那么只需将该主存单元移入Cache中,造成一次缺失(Cache Miss)。
接着,CPU访问编号为31的主存单元,则必须从Cache中换出一块,才能将编号为31的主存单元移入Cache,假设我们移出了编号为10的主存单元。
接着,CPU再次访问编号为10的主存单元,则又引起了一次缺失。我们看到,如果在上一次删除时,删除其他的单元,则可以避免本次访问的缺失。
在现代计算机中,往往采用LRU(最近最少使用)的算法来进行Cache调度——可是,从上一个例子就能看出,这并不是最优的算法。
对于一个固定容量的空Cache和连续的若干主存访问请求,聪聪想知道如何在每次Cache缺失时换出正确的主存单元,以达到最少的Cache缺失次数。

Input

输入文件第一行包含两个整数N和M(1<=M<=N<=100,000),分别代表了主存访问的次数和Cache的容量。
第二行包含了N个空格分开的正整数,按访问请求先后顺序给出了每个主存块的编号(不超过1,000,000,000)。

Output

输出一行,为Cache缺失次数的最小值。

Sample Input

6 2

1 2 3 1 2 3

Sample Output

4

HINT

在第4次缺失时将3号单元换出Cache。

题解

先离散化再贪心一下
设第i个位置下一个相同的单元是nxt[i],如果没有的话nxt[i]=n+1
那每次弹出肯定是弹出nxt[i]最大的
那你可以搞一个可删堆,维护nxt[i]
然后又是随便做了。。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
struct LSnode{int y,p;}w[110000];
bool cmp(LSnode n1,LSnode n2){return n1.y<n2.y;}
int pla[110000];
struct node
{int pla;friend bool operator <(node n1,node n2){return n1.pla<n2.pla;}
};
struct heap
{priority_queue<node> A,B;void push(node x){A.push(x);}void pop(){node tx,ty;tx=A.top();if(B.size())ty=B.top();while(tx.pla==ty.pla && B.size()){A.pop();B.pop();tx=A.top();ty=B.top();}A.pop();}void erase(node x){B.push(x);}node top(){node tx,ty;tx=A.top();if(B.size())ty=B.top();while(tx.pla==ty.pla && B.size()){A.pop();B.pop();tx=A.top();ty=B.top();}return A.top();}
}q;
int nxt[110000],las[110000];
int n,m,col[110000];
bool vis[110000];
int main()
{
//  freopen("swap10.in","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&w[i].y),w[i].p=i;sort(w+1,w+1+n,cmp);int tt=1;col[w[1].p]=1;for(int i=2;i<=n;i++){if(w[i].y!=w[i-1].y)tt++;col[w[i].p]=tt;}memset(las,-1,sizeof(las));for(int i=n;i>=1;i--){if(las[col[i]]==-1)nxt[i]=n+1,las[col[i]]=i;else nxt[i]=las[col[i]],las[col[i]]=i;}memset(vis,false,sizeof(vis));int ans=0,cnt=0,beg=-1;for(int i=1;i<=n;i++){if(!vis[col[i]]){if(cnt==m){beg=i;break;}vis[col[i]]=true;ans++;cnt++;node tmp;tmp.pla=nxt[i];q.push(tmp);}else {node tmp;tmp.pla=i;q.erase(tmp);tmp.pla=nxt[i];q.push(tmp);}if(cnt==m){beg=i+1;break;}}if(beg==-1)printf("%d\n",ans);else{for(int i=beg;i<=n;i++){if(!vis[col[i]]){vis[col[i]]=true;ans++;node tmp;tmp=q.top();if(tmp.pla!=n+1)vis[col[tmp.pla]]=false;q.pop();tmp.pla=nxt[i];q.push(tmp);}else{node tmp;tmp.pla=i;q.erase(tmp);tmp.pla=nxt[i];q.push(tmp);}}printf("%d\n",ans);}return 0;
}

[bzoj1826][贪心]缓存交换相关推荐

  1. bzoj1826: [JSOI2010]缓存交换

    传送门 界定内存放进去还是出来的是他下一次出现的位置(没有是n+1) 显然先出现的比后出现的更优. 然后优先队列水一波. #include<cstdlib> #include<ios ...

  2. 程序员面试金典——17.1无缓存交换

    程序员面试金典--17.1无缓存交换 主要是利用异或性质~ 程序员面试金典--17.1无缓存交换 class Exchange { public:vector<int> exchangeA ...

  3. 无缓存交换 牛客网 程序员面试金典 C++ Python

    无缓存交换 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个函数,函数内不使用任何临时变量,直接交换两个数的值. 给定一个int数组AB,其第零个元素和第一个元素为待交换的值,请返回 ...

  4. 【BZOJ1826】【tyvj2644】缓存交换,贪心+堆维护

    传送门1 传送门2 写在前面:Shallwe回家养病依然努力刷题,实乃我辈楷模 思路:比较容易想到的贪心思路(虽然一开始我对这个思路有点虚,因为太弱不会证明,大体理解一下就好= =),用堆维护一下ne ...

  5. JSOI2010 BZOJ1826 缓存交换

    洛谷 BZOJ 分析 贪心策略很好想,显然,当 \(cache\) 未满时,直接放进去就行了: \(cache\) 满了的时候,考虑交换哪一个,不难看出可以交换下一次出现最晚的那个. 注意:不开 \( ...

  6. bzoj 1826 缓存交换

    题目大意: 一些数,需要将他们依次取入一个集合中 集合的容量有限 若该数已经在集合中则不用再取 每次取的时候可以将集合中与元素替换为另一个,也可以不换,直接加入前提是不超过集合容量 求最后最小的取数次 ...

  7. 【bzoj 18261528】: [JSOI2010]缓存交换

    传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1826 http://www.lydsy.com/JudgeOnline/problem.ph ...

  8. 1826: [JSOI2010]缓存交换

    Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache.此时,如果Cache容量已满,则必须先从中删除一 ...

  9. [BZOJ]1826: [JSOI2010]缓存交换 线段树

    Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache.此时,如果Cache容量已满,则必须先从中删除一 ...

最新文章

  1. axi dma direct 模式 总结
  2. 以下属于4nf的分解为_中科院电工所张国强团队特稿:活性氧化铝和分子筛对C3F7CN/CO2及其过热分解产物的吸附特性...
  3. 由Dvbbs PHP 0day引发的争论
  4. Spring:自动装配模式
  5. 设计模式之责任链模式(Java实现)
  6. linux 如何停止mysql,linux下如何启动/停止/重启mysql:
  7. SwiftUI SF Symbols 好处及其使用指南
  8. 如何才能降低亚马逊账号关联?
  9. 键盘上哪个键是ESCAPE键?
  10. 虚拟机启动时,提示找不到ISO映像文件
  11. 【华为机试】HJ2 计算某字符出现次数
  12. UI设计中色彩搭配使用技巧
  13. 剑三服务器维护后蹲宠刷新吗,剑三宠物开服刷新点合集 重置版除奇遇外宠物刷新点一览...
  14. HACK RF学习之旅记录1——填坑历程
  15. Microsoft IExpress:微软自带的安装程序包制作工具
  16. Python列表(获取列表中指定元素的索引、获取列表中的多个元素、判断指定元素是否在列表中存在、列表元素的遍历、列表元素的增加操作、 列表元素的删除操作、列表元素的修改操作、列表元素的排序操作)
  17. Delphi idFTP
  18. 计算机无法自动连接网络地址,ip地址错误网络无法连接怎么办-ip地址错误网络无法连接解决办法 - 河东软件园...
  19. C语言—判断整数的奇偶
  20. 支持两台计算机间安全连接的是什么,如何建立两台计算机之间的连接?

热门文章

  1. Golang开发工程师面试题整理
  2. cad图纸怎么转换成pdf格式
  3. 非常棒的19个自学计算机语言的网站合计-你值得收藏
  4. win11如何开启剪贴板历史记录 windows11开启剪贴板历史记录的设置方法
  5. 什么是网络安全等保制度
  6. 程序员工作5年以上,找工作还看学历吗?
  7. 一、 计算机的体系结构
  8. 吕爱国告诉你:关于教师资格申请程序,你需要知道这些!
  9. 营养与健康(HIT2021秋)
  10. GridView编辑PageTemplate页模板