bzoj1826: [JSOI2010]缓存交换

这题玄学贪心

每次选择next出现位置最大的删除

有一个小trick,就是每次找到在队列里面的,就要再插入一次更新next,而前面的next怎么也不可能最大可以忽视。

为啥离散化错了。。。而且说好的主存块的编号(不超过1,000,000,000)和1<=M<=N<=100,000呢(m去到了十亿而编号去到100w)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

int a[1100000];
int lslen,ls[1100000];
int last[1100000],next[1100000];

struct node
{
    int x,next;
    friend bool operator<(node n1,node n2){return n1.next<n2.next;}
};priority_queue<node>q;bool v[1100000];
int main()
{
    freopen("swap.in","r",stdin);
    freopen("swap.out","w",stdout);
    int n,m,x,y;
    scanf("%d%d",&n,&m);m=min(n,m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]), ls[++lslen]=i;
        
    memset(last,63,sizeof(last));
    for(int i=n;i>=1;i--) next[i]=last[a[i]], last[a[i]]=i;
    
    int ans=0,size=0;
    memset(v,false,sizeof(v));
    for(int i=1;i<=n;i++)
    {
        if(v[a[i]]==true)
        {
            node tt;tt.x=a[i];tt.next=next[i];
            q.push(tt);continue;
        }
        if(size==m)
        {
            size--;
            v[q.top().x]=false;q.pop();
        }
        ans++;size++;
        node tt;tt.x=a[i];tt.next=next[i];
        q.push(tt);v[a[i]]=true;
    }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2018-04-22 21:43  AKCqhzdy  阅读(121)  评论(0编辑  收藏  举报