zoukankan      html  css  js  c++  java
  • bzoj1528 [POI2005]sam-Toy Cars

    Description

    Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上都不会有超过k 个玩具. Jasio 在地板上玩玩具. Jasio'的妈妈则在房间里陪他的儿子. 当Jasio 想玩地板上的其他玩具时,他会自己去拿,如果他想玩的玩具在架子上,他的妈妈则会帮他去拿,当她拿玩具的时候,顺便也会将一个地板上的玩具放上架子使得地板上有足够的空间. 他的妈妈很清楚自己的孩子所以他能够预料到Jasio 想玩些什么玩具. 所以她想尽量的使自己去架子上拿玩具的次数尽量的少,应该怎么安排放玩具的顺序呢?

    Input

    第一行三个整数: n, k, p (1 <= k <= n <= 100.000, 1 <= p <= 500.000), 分别表示玩具的总数,地板上玩具的最多个数以及Jasio 他想玩玩具的序列的个数,接下来p行每行描述一个玩具编号表示Jasio 想玩的玩具.

    Output

    一个数表示Jasio 的妈妈最少要拿多少次玩具.

    Sample Input

    3 2 7
    1
    2
    3
    1
    3
    1
    2

    Sample Output

    4
     
    求出每一个玩具在之后第一次再次出现的位置nex[i],然后在当前已经有k个的时候就把nex[i]最小的i删掉
    所以用个堆维护就好了
    涨姿势了……原来有种stl叫配对堆
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<ctime>
    #include<ext/pb_ds/priority_queue.hpp>
    #define LL long long
    #define inf 0x7ffffff
    #define pa pair<int,int>
    #define pi 3.1415926535897932384626433832795028841971
    using namespace std;
    using namespace __gnu_pbds;
    inline LL read()
    {
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,k,p,now=1,ans;
    int a[500010];
    int lst[100010];
    int nex[500010];
    bool mrk[100010];
    __gnu_pbds::priority_queue <pa >q;
    int main()
    {
        n=read();k=read();p=read();
        for (int i=1;i<=p;i++)a[i]=read();
        for (int i=1;i<=n;i++)lst[i]=p+1;
        for (int i=p;i>=1;i--)
        {
            nex[i]=lst[a[i]];
            lst[a[i]]=i;
        }
        ans=k;
        while (k&&now<=p)
        {
            q.push(make_pair(nex[now],a[now]));
            if (!mrk[a[now]])k--;
            mrk[a[now]]=1;
            now++;
        }
        for (int i=now;i<=p;i++)
        {
            if (mrk[a[i]])
            {
                q.push(make_pair(nex[i],a[i]));
                continue;
            }
            while (!mrk[q.top().second])q.pop();
            int fst=q.top().first,cnd=q.top().second;
            q.pop();
            mrk[cnd]=0;
            q.push(make_pair(nex[i],a[i]));
            mrk[a[i]]=1;
            ans++;
        }
        printf("%d
    ",ans);
        return 0;
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    PHP 大小写转换、首字母大写、每个单词首字母大写转换相关函数
    【论文学习4】BiSample: Bidirectional Sampling for Handling Missing Data with Local Differential Privacy
    【论文学习3】Local Differential Privacy for Deep Learning
    【论文学习2】 Differential Privacy Reinforcement Learning
    深度学习中的优化算法
    Spatial crowdsourcing
    “pip install tensorflow ”出现错误
    python或pip'不是内部或外部命令”
    pip install torch出现错误
    打不开gitHub的解决方法
  • 原文地址:https://www.cnblogs.com/zhber/p/4150496.html
Copyright © 2011-2022 走看看