1. 程式人生 > >ACM訓練日記—4月21日(西安電子科技大學第16屆程式設計競賽網路同步賽)

ACM訓練日記—4月21日(西安電子科技大學第16屆程式設計競賽網路同步賽)

int n,m,q;
int a[50005];
int mp[50005];
int vis[50005];
int main()
{
    priority_queue<int>h;
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        while(!h.empty()) h.pop();
        memset(vis,-1,sizeof(vis));
        memset(mp,0,sizeof(mp));//記錄該位上的值下次出現的位置
        for(int i=1;i<=q;i++)
        {
            scanf("%lld",&a[i]);
            if(mp[a[i]]==0)
            {
                mp[a[i]]=i;
            }
            else
            {
                int t=a[i];
                vis[mp[t]]=i;
                mp[t]=i;
            }
        }
        //for(int i=1;i<=q;i++) cout<<vis[i]<<" ";cout<<endl;
        memset(mp,0,sizeof(mp));
        int ans=0;
        for(int i=1;i<=q;i++)
        {
            if(mp[a[i]]) continue;//該值在佇列裡
            if(h.size()<n)//佇列不滿,繼續放
            {
                h.push(vis[i]);
                mp[a[i]]=1;
                ans++;
            }
            else//取出最小的,因為會優先取出-1(後面沒在出現的值)
            {
                ll e=h.top();
                h.pop();
                h.push(vis[i]);
                mp[e]=0;
                mp[a[i]]=1;
                ans++;
            }
        }
        cout<<ans<<endl;
    }
}