树状数组求调,玄关
查看原帖
树状数组求调,玄关
470960
Yellow_and_Strong楼主2023/11/10 15:52

rt

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int MAXN = 1e5 + 10;

inline int read()
{
    int x = 0; char ch = getchar();
    while (!isdigit(ch)) ch = getchar();
    while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
    return x;
}
inline void write (int x)
{
    if (x > 9) write(x / 10);
    putchar (x % 10 + 48);
}

int n, k, a[MAXN], b[MAXN];
inline void input()
{
    n = read(), k = read();
    for (int i = 1; i <= n; ++ i) b[i] = a[i] = read();
}

int rnk[MAXN]; vector <int> cnt[MAXN];
inline void init()
{
    sort (a + 1, a + n + 1);
    int _k = unique(a + 1, a + n + 1) - a - 1;
    for (int i = 1; i <= n; ++ i)
        rnk[i] = lower_bound(a + 1, a + _k + 1, b[i]) - a, cnt[rnk[i]].push_back(i);
}

int last[MAXN], ans, c[MAXN]; unordered_map <int, bool> m;
inline int lowbit (int x) { return x & (-x); }
inline void update (int pos, int val)
{
    while (pos <= n)
    {
        c[pos] += val;
        pos += lowbit(pos);
    }
}
inline int query (int pos)
{
    int res = 0;
    while (pos > 0)
    {
        res += c[pos];
        pos -= lowbit(pos);
    }
    return res;
}
inline void work()
{
    int kind = 0;
    for (int i = 1; i <= n; ++ i)
    {
        if (!m[rnk[i]]) ++ kind;
        else update(last[rnk[i]], -1);
        m[rnk[i]] = true, update(last[rnk[i]] = i, 1);
        int l = 0, r = i, mid, pos;
        while (l <= r)
        {
            mid = l + r >> 1;
            if (kind - query(mid - 1) <= k + 1) r = mid - 1, pos = mid;
            else l = mid + 1;
        }
        l = 0, r = cnt[rnk[i]].size() - 1, mid; int res = 0;
        while (l <= r)
        {
            mid = l + r >> 1;
            if (pos <= cnt[rnk[i]][mid]) r = mid - 1, res = mid;
            else l = mid + 1;
        }
        ans = max(ans, (long long)(cnt[rnk[i]].size() - 1 - res));
    }
}

inline void output() { write(ans), putchar('\n'); }

signed main()
{
    input();
    init();
    work();
    output();
    return 0;
}
2023/11/10 15:52
加载中...