码迷,mamicode.com
首页 > 其他好文 > 详细

[USACO13JAN]Cow Lineup

时间:2018-09-24 21:08:08      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:ref   mat   main   之间   维护   for   script   max   php   

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

标签:ref   mat   main   之间   维护   for   script   max   php   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!