[USACO13JAN]Cow Lineup
Posted wyxwyx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO13JAN]Cow Lineup相关的知识,希望对你有一定的参考价值。
Description
Solution
由于两个点之间最多可以有(k+1)种牛,而牛的种数是单调的。所以可以用尺取法(区间伸缩法),每次右移右端点后,让左端点不断右移直到牛的种数不大于(k+1)就好了。
Code
#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
", ans);
return 0;
}
Note
当需要维护的性质满足区间单调的话,可以尝试尺取法。
以上是关于[USACO13JAN]Cow Lineup的主要内容,如果未能解决你的问题,请参考以下文章
P3069 [USACO13JAN]牛的阵容Cow Lineup
bzoj3048[Usaco2013 Jan]Cow Lineup 尺取法
[bzoj3048] [Usaco2013 Jan]Cow Lineup
[BZOJ 3048][Luogu P3069][USACO2013 Jan]Cow Lineup