题目链接
贪心思路:
最先从堆里删除的是距离最远的那个。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
const int N = 100010;
//#define int long long
map<int,int> ha;
int n,m;
int a[N],ne[N];
bool st[N];
priority_queue<int>heap;
signed main()
{
cin>>n>>m;
int idx=0;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=n;i>=1;i--)
{
if(!ha.count(a[i]))
{
ha[a[i]]=i;
ne[i]=N;
}
else
{
ne[i]=ha[a[i]];
ha[a[i]]=i;
}
}
int res=0,cnt=0;
for(int i=1;i<=n;i++)
{
if(!st[i])
{
res++;
if(cnt<m)
{
cnt++;
st[ne[i]]=true;
heap.push(ne[i]);
}
else
{
st[heap.top()]=false;
heap.pop();
st[ne[i]]=true;
heap.push(ne[i]);
}
}
else
{
st[ne[i]]=true;
heap.push(ne[i]);
}
}
cout<<res<<endl;
}