传送门1
传送门2
写在前面:Shallwe回家养病依然努力刷题,实乃我辈楷模
思路:比较容易想到的贪心思路(虽然一开始我对这个思路有点虚,因为太弱不会证明,大体理解一下就好= =),用堆维护一下next
堆中没有该编号元素时
1.cache有空就直接往堆里加,标记为1;
2.没空了就要先弹出弹出next最大的元素(next[i]是指和第i号元素编号相同且在i后面的第一个元素),标记为0,再执行1操作
3.ans++
有该编号元素时
需要对堆中的该编号元素的next修改,这让我纠结了好久,正当我要放弃堆转写平衡树时,http://blog.csdn.net/kemlkyo/article/details/21812933给了我启示:其实不用管原来堆中的元素,直接再push进一个(next值要为该元素的next)就行了。至于证明,我是这么想的:
设原先堆中的元素为i,新入堆的编号相同的元素为j,该元素的编号标记没变(为1,即在堆中),当该编号元素要调用时(即到了堆顶),调用的元素必定为j(因为next[j]>next[i]),且当j弹出时,该元素的编号标记变为0,相当于堆中已经没有了该编号元素,而且也不用担心i会到堆顶来,因为j弹出后进来的元素的next一定比i的next大(next[i]=j,而后进来的元素本身就在j后头,next更不例外)
注意:
1.离散化可以用map
2.对于后面没有next的元素,把它的next赋值为无穷大(其实n+1就行)
代码:

#include"bits/stdc++.h"
#include<set>
using namespace std;
int n,m,tot,ans,x;
int last[100010],a[100010];
bool flag[100010];
struct os
{int next,num;bool operator <(const os other)const{return next<other.next;}
}p[100010];
map<int,int> mp;
priority_queue<os> q;
main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){scanf("%d",&x);if (!mp[x]) mp[x]=++tot;a[i]=mp[x];}for (int i=n;i>=1;i--){p[i].num=a[i];if (last[a[i]]) p[i].next=last[a[i]];else p[i].next=n+1;last[a[i]]=i;}for (int i=1;i<=n;i++){if (!flag[p[i].num]){ans++;if (m) m--;else flag[q.top().num]=0,q.pop();flag[p[i].num]=1;}q.push(p[i]);}printf("%d",ans);
}

【BZOJ1826】【tyvj2644】缓存交换,贪心+堆维护相关推荐

  1. bzoj1826: [JSOI2010]缓存交换

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

  2. POJ 2010 Moo University - Financial Aid(堆维护滑窗kth,二分)

    按照score排序,贪心,从左到右用堆维护并且记录前面的最小N/2个花费之和. 然后从右向左枚举中位数,维护N/2个数之和加上并判断是否满足条件.(stl的队列没有clear(),只能一个一个pop. ...

  3. P3620-[APIO/CTSC2007]数据备份【贪心,堆,链表】

    正题 题目链接:https://www.luogu.com.cn/problem/P3620 题目大意 一条线上有nnn个位置,选出kkk对使得它们的距离差之和最小. 解题思路 因为一定是连接相邻的最 ...

  4. 【贪心+堆/模拟费用流增广】BZOJ4946 [NOI2017]蔬菜

    一道思路很好的题,因为篇幅太长赶时间,以下多数转自这里 [题目] 定义了一种蔬菜为: a i , s i , c i , x i a_i,s_i,c_i,x_i ai​,si​,ci​,xi​,有 n ...

  5. POJ3190,P2859-Stall Reservations(摊位预订)【贪心,堆】

    正题 POJ题目链接:http://poj.org/problem?id=3190 luogu评测记录:https://www.luogu.org/recordnew/lists?uid=52918& ...

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

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

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

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

  8. [bzoj1826][贪心]缓存交换

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

  9. JSOI2010 BZOJ1826 缓存交换

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

最新文章

  1. 第四百六十八天 how can I 坚持
  2. 蜘蛛爬虫网络高像素图片抓取工具[搜索引擎]
  3. 语义分割DeepLab v2--DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolut
  4. 【错误记录】Flutter 报错 ( Android Studio 中 main.dart 左侧不显示设备栏 )
  5. 虚拟机批量安装LINUX,基于vmware workstation的 pxe + kickstart批量安装linux
  6. raise IOError('The file is not exist!')
  7. Catalan Numbers 卡特兰数
  8. boost::python::to_python_converter相关的测试程序
  9. Wargame.kr_Web:already got
  10. wxpython入门_wxpython笔记:Wxpython入门
  11. MSSQL数据批量插入优化详细
  12. 开火锅店的明星们,什么时候才能不道歉?
  13. [转载]在ASP.NET中使用Microsoft Word文档
  14. python中jieba分词快速入门
  15. JDK8编译,JDK8运行错误
  16. 查看docker镜像内部端口号_Docker 安装部署
  17. Python项目导出依赖包requirements.txt
  18. 关于CS61b sp21中proj0的问题
  19. python程序设计题库-知到智慧树_Python程序设计基础_完整免费答案
  20. 2010-2011年美国大学综合排名

热门文章

  1. 技术谈 | SDN 和 NFV 之间的爱与恨
  2. 与台风相伴,他们是前行的逆风者
  3. 基于华为云对话机器人技能平台的规则模板概述
  4. javascript基础修炼(10)——VirtualDOM和基本DFS
  5. 华为云微服务应用平台服务能力业界领先,通过微服务标准首批评估
  6. 下载的字幕php是什么格式的,mkv是什么文件格式
  7. 关于老师给的数据集,链接1
  8. Java 打印 99 乘法表
  9. acm国际大学上计算机竞赛,ACM国际大学生程序设计竞赛
  10. oracle linux内存推荐分配,[20191114]linux内存分配的讨论.txt