[USACO13JAN]Cow Lineup

Posted wyxwyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO13JAN]Cow Lineup相关的知识,希望对你有一定的参考价值。

Description

Luogu3069
USACO

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

BZOJ 1699 [Usaco2007 Jan]Balanced Lineup排队 线段树

[BZOJ] 1636: [Usaco2007 Jan]Balanced Lineup