首页 > 其他 > 详细

[USACO13JAN]Cow Lineup

时间:2018-09-24 20:58:34      阅读:180      评论:0      收藏:0      [点我收藏+]

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\n", ans);
    return 0;
}

Note

当需要维护的性质满足区间单调的话,可以尝试尺取法。

[USACO13JAN]Cow Lineup

原文:https://www.cnblogs.com/wyxwyx/p/usaco13jangolda.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!