1826: [JSOI2010]缓存交换
来源:互联网 发布:java.util详解 编辑:程序博客网 时间:2024/05/24 03:21
题目链接
题目大意:有一个起始状态为空的集合,对集合会进行n次操作
每次操作会在集合中查找元素x,如果集合中没有元素x,那么不开心度就会+1,同时如果集合内元素个数小于m,那么他会把x放入集合中;如果集合内元素等于m,那么他必须删去集合中一个元素,然后再把x放入集合
最小化不开心度
题解:贪心,删掉后继位置最大的元素
用堆维护
具体实现:若x存在:更新x的nxt
若堆满:弹出
将x加入堆中
由于二叉堆无法直接修改堆中元素,这里直接加入一个新元素
显然旧元素就没有用了
但是这样需要额外记录tot表示堆中元素个数,不能直接用堆的size()函数
我的收获:堆的trick,贪心大法
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <map>#include <queue> using namespace std;const int M=100005;int n,m;int a[M],nxt[M];struct number{ int x,val; number(int _x,int _val){x=_x,val=_val;}};bool operator <(number a,number b){return a.val<b.val;}map<int,int> mp,vis;priority_queue<number> q;void work(){ int ans=0,tot=0; for(int i=1;i<=n;i++) { if(vis[a[i]]){q.push(number(a[i],nxt[i]));continue;} if(tot==m){ tot--; while(!q.empty()){ number t=q.top();q.pop(); vis[t.x]=0; break; } } ans++;tot++; vis[a[i]]=1; q.push(number(a[i],nxt[i])); } cout<<ans<<endl;}void init(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=n;i>=1;i--){ if(mp.count(a[i])) nxt[i]=mp[a[i]]; else nxt[i]=n+1; mp[a[i]]=i; }}int main(){ init(); work(); return 0;}
阅读全文
0 0
- 1826: [JSOI2010]缓存交换
- 1826: [JSOI2010]缓存交换
- bzoj 1826: [JSOI2010]缓存交换
- 【bzoj 1826&1528】: [JSOI2010]缓存交换
- [BZOJ]1826: [JSOI2010]缓存交换 线段树
- 【贪心】【JSOI2010】缓存交换
- bzoj1826: [JSOI2010]缓存交换
- bzoj1826: [JSOI2010]缓存交换
- bzoj1826: [JSOI2010]缓存交换 贪心+优先队列
- 【BZOJ】【P1826&P1528】【JSOI2010】【缓存交换】【题解】【堆+贪心】
- 无缓存交换
- 【BZOJ1826】【tyvj2644】缓存交换,贪心+堆维护
- centos 建立swap交换缓存区
- [JSOI2010]Group部落划分
- 【BZOJ 1823】 [JSOI2010]满汉全席
- 2208: [Jsoi2010]连通数
- BZOJ 1823: [JSOI2010]满汉全席
- bzoj 1823 [JSOI2010]满汉全席
- Jsp 实现Email发送,QQ邮箱发送时530错误的解决
- java中常用的字符串的截取方法
- 按钮布局演示
- java三种排序(冒泡,选择,方法sort)
- mUDP是UDP的延伸,除了具有UDP的功能外,还能记录所发送的包的信息。mUdpSink可以把接收到的包的信息记录到文件中。
- 1826: [JSOI2010]缓存交换
- LeetCode--Roman to Integer
- 2级购物车
- 二维火Android云收银模块化实践
- Java中动态加载jar文件和class文件
- 剑指offer 49 不用加减乘除做加法
- OKhttp的简单封装加拦截器
- LaTex(PART XVII)布局相关(II)页面相关参数
- Linux——如何安装WPS