zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        return 0;
    }
  • 相关阅读:
    linux下程序运行时间的获取方法,
    网络通信过程(转&自己完善)
    关于找工作&毕设
    linux进程间通信(IPC)几种方式
    asp.net2.0新特性概述 之二
    vs2005新特性
    C#高级特性
    Asp.net2.0新特性 之三
    当前流行的网站设计风格(转贴)
    ASP.NET 2.0 新特性 之一
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8909749.html
Copyright © 2011-2022 走看看