这题玄学贪心
每次选择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; }