bzoj1826: [JSOI2010]缓存交换

来源:互联网 发布:菜刀切到手 知乎 编辑:程序博客网 时间:2024/06/05 18:13

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

#include<cstdlib>  #include<iostream>  #include<cstdio>  #include<cmath>  #include<algorithm>  #include<cstring>#include<map>#include<queue>using namespace std;const int N=100005;map<int,int> s,vis;struct node{    int x,val;    node(int k,int b){x=k;val=b;}    bool operator < (node t) const{return val<t.val;}};priority_queue<node> q;int a[N],next[N],n,m,ans,tot;int main(){      scanf("%d%d",&n,&m);    for (int i=1;i<=n;i++) scanf("%d",&a[i]);    for (int i=n;i;i--){        if (s.count(a[i])) next[i]=s[a[i]]; else next[i]=n+1;        s[a[i]]=i;    }    for (int i=1;i<=n;i++){        if (vis[a[i]]){            q.push(node(a[i],next[i]));            continue;        }        if (tot==m){            tot--;            while (!q.empty()){                node t=q.top();                q.pop();                if (!vis[t.x]) continue;                vis[t.x]=0;                break;            }        }        ans++;        vis[a[i]]=1;        q.push(node(a[i],next[i]));        tot++;    }    printf("%d",ans);}