求助求助60pts
查看原帖
求助求助60pts
168597
DraTelligence楼主2022/10/27 21:49

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;
}
2022/10/27 21:49
加载中...