1826: [JSOI2010]缓存交换
2017-10-25 20:23
309 查看
题目链接
题目大意:有一个起始状态为空的集合,对集合会进行n次操作
每次操作会在集合中查找元素x,如果集合中没有元素x,那么不开心度就会+1,同时如果集合内元素个数小于m,那么他会把x放入集合中;如果集合内元素等于m,那么他必须删去集合中一个元素,然后再把x放入集合
最小化不开心度
题解:贪心,删掉后继位置最大的元素
用堆维护
具体实现:若x存在:更新x的nxt
若堆满:弹出
将x加入堆中
由于二叉堆无法直接修改堆中元素,这里直接加入一个新元素
显然旧元素就没有用了
但是这样需要额外记录tot表示堆中元素个数,不能直接用堆的size()函数
我的收获:堆的trick,贪心大法
题目大意:有一个起始状态为空的集合,对集合会进行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; }
相关文章推荐
- 【优先队列+贪心】BZOJ1826-[JSOI2010]缓存交换
- bzoj 1826: [JSOI2010]缓存交换
- 1826: [JSOI2010]缓存交换
- BZOJ1826: [JSOI2010]缓存交换
- 1826: [JSOI2010]缓存交换
- BZOJ 1826: [JSOI2010]缓存交换
- [bzoj1826] [JSOI2010]缓存交换
- BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心
- 【bzoj 1826&1528】: [JSOI2010]缓存交换
- bzoj1826: [JSOI2010]缓存交换
- [BZOJ]1826: [JSOI2010]缓存交换 线段树
- bzoj1826: [JSOI2010]缓存交换 贪心+优先队列
- 【贪心】【JSOI2010】缓存交换
- 【BZOJ】【P1826&P1528】【JSOI2010】【缓存交换】【题解】【堆+贪心】
- 【BZOJ1826】【tyvj2644】缓存交换,贪心+堆维护
- 【BZOJ】【2208】【JSOI2010】连通数
- 【bzoj1821】[JSOI2010]Group 部落划分 Group
- BZOJ2208 [Jsoi2010]连通数
- HYSBZ 1821 [JSOI2010]Group 部落划分(kruskal)(中等)
- 【BZOJ】1821: [JSOI2010]Group 部落划分 Group(最小生成树+贪心)