WA on #3#4#6#9
很神奇的是这几个点都比答案大1,ans-1就能对这四个点,求大佬!!
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <stack>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
inline ll read() {
register ll n = 0, s = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') s = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
n = (n << 1) + (n << 3) + c - '0';
c = getchar();
}
return s * n;
}
// P4404 [JSOI2010]缓存交换
bool in[(int)1e5 + 5];
int last[(int)1e5 + 5];
int inp[(int)1e5 + 5], temp[(int)1e5 + 5];
pii oper[(int)1e5 + 5];
int main() {
int n = read(), m = read();
int cnt = 0, ans = 0;
priority_queue<pii> q;
for (int i = 0; i < n; i++) {
inp[i] = temp[i] = read();
}
sort(temp, temp + n);
unique(temp, temp + n);
for (int i = 0; i < n; i++) {
inp[i] = lower_bound(temp, temp + n, inp[i]) - temp;
oper[i] = pii(1e9, inp[i]);
oper[last[inp[i]]].first = i;
last[inp[i]] = i;
}
for (int i = 0; i < n; i++) {
q.push(oper[i]);
if (in[oper[i].second]) {
continue;
}
ans++;
in[oper[i].second] = true;
if (++cnt <= m) {
continue;
}
pii max = q.top();
q.pop();
if (max.first == oper[i].first) {
max = q.top();
q.pop();
q.push(oper[i]);
}
in[max.second] = false;
}
cout << ans;
return 0;
}