标签:ref mat main 之间 维护 for script max php
由于两个点之间最多可以有\(k+1\)种牛,而牛的种数是单调的。所以可以用尺取法(区间伸缩法),每次右移右端点后,让左端点不断右移直到牛的种数不大于\(k+1\)就好了。
#include <cstdio>
#include <algorithm>
const int N = 100010;
int n, k, a[N], b[N], c[N];
int col[N], tot, ans;
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
b[i] = a[i];
}
std::sort(b+1, b+1+n);
int nw = std::unique(b+1, b+1+n) - b;
for (int i = 1; i <= n; ++i) {
c[i] = std::lower_bound(b+1, b+1+nw, a[i]) - b;
}
int l = 1, r = 1;
while (r <= n) {
if (col[c[r++]]++ == 0) tot++;
while (tot > k+1) {
if (--col[c[l++]] == 0) tot--;
}
ans = std::max(ans, col[c[r-1]]);
}
printf("%d\n", ans);
return 0;
}
当需要维护的性质满足区间单调的话,可以尝试尺取法。
标签:ref mat main 之间 维护 for script max php
原文地址:https://www.cnblogs.com/wyxwyx/p/usaco13jangolda.html