传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1826
写一写画一画可以发现,当不得不弹出一个主存单元时,弹出下一次出现最晚的一定是最优的。
于是优先队列搞之。。。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <map> #include <algorithm> using namespace std; const int maxn = 100010; int a[maxn], nxt[maxn]; map <int, int> s, vis; int n, m, ans; struct node { int x, val; node() {} node(int k, int b) { x = k; val = b; } bool operator < (node t) const { return val < t.val; } }; priority_queue <node> q; int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++) { scanf("%d", &a[i]); } for(int i = n; i ; i --) { if(s.count(a[i])) nxt[i] = s[a[i]]; else nxt[i] = n + 1; s[a[i]] = i; } int tot = 0; for(int i = 1; i <= n; i ++) { if(vis[a[i]] == 1) { q.push(node(a[i], nxt[i])); continue; } if(tot == m) { tot --; while(!q.empty()) { node t = q.top(); q.pop(); if(vis[t.x] == 0) continue; vis[t.x] = 0; break; } } ans ++; vis[a[i]] = 1; q.push(node(a[i], nxt[i])); tot ++; } printf("%d\n", ans); return 0; }