[JSOI2010]缓存交换

当遇到需要将主存单元加进cache的时候,就看cache里是否满了,满了的话,就删除离最靠后的那一个,这样一定最优。
但是网上博客的代码太长了。。。其实只需要判断一下当前的优先队列的top是否仍在cache中即可。

(重题:[POI2005]SAM-Toy Cars,AC数+=2

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
priority_queue<int>q;
const int N=100005;
int n,m,a[N],b[N],last[N],nxt[N],cnt,ans;
bool vis[N];
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];
    sort(b+1,b+1+n);int u=unique(b+1,b+1+n)-b-1;
    for(int i=1;i<=n;i++)
    a[i]=lower_bound(b+1,b+1+u,a[i])-b,
    nxt[last[a[i]]]=i,last[a[i]]=i;
    for(int i=1;i<=u;i++) nxt[last[i]]=n+i,a[n+i]=i;
    for(int i=1;i<=n;i++) {
        while(q.size()&&vis[a[q.top()]]==false)
        q.pop();
        if(vis[a[i]]) {q.push(nxt[i]);continue;}
        if(cnt<m) {
            vis[a[i]]=1,
            cnt++,ans++,
            q.push(nxt[i]);
            continue;
        }
        vis[a[q.top()]]=0,
        ans++,q.pop();
        q.push(nxt[i]);
        vis[a[i]]=1;
    }
    cout<<ans<<endl;
    return 0;
}
缓存交换
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9674808.html