BSOJ 4208 -- 【USACO 2013 Jan】奶牛队列

Description
FJ的奶牛(1≤n≤100000)排成一排。每头奶牛由一个整数”品种ID(0……1000000000之间)”表示其类别;多个奶牛的品种ID可以是一样的.FJ想让他的牛看起来更令人印象深刻,需要将一部份品种移出队列,以便同一类奶牛站在一起的宽度最长,也就是一个大的连续的块的奶牛都有相同的ID。F选择最多K个品种从队列中移出,请你回答最后该最大连续块的奶牛数量是多少?
Input
* 1行:两个用空格隔开的整数:N和K。
* 2..1+N行: 依次表示第I个奶牛的品种ID.
Output
* 1行:最大连续块的奶牛数量
Sample Input
9 1
2
7
3
7
7
3
7
5
7
Sample Output
4
Hint
样例说明:
队列有9头奶牛,以品种编号为2,7,3,7,7,3,7,5,7。FJ想去除最多1个品种奶牛。最后选择品种3移出,则连续有4个品种为7的奶牛站在一起。

化动为静,
每次只算区间右端的数的最大数量。
转化成O(n)
综合为O(nlogn)

#include
#include
#include
#include
#include
#include
using namespace std;
map<int,int>Map,M;
int t=0;
int A[100005];
int n,k;
int last[100005];
int ha[100005];
int cnt=0;
void Add(int x){
    ha[M[x]]++;
    if(ha[M[x]]==1)cnt++;
}
void Del(int x){
    ha[M[x]]--;
    if(ha[M[x]]==0)cnt--;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&A[i]);
        if(M[A[i]]==0)M[A[i]]=++t;
        last[i]=Map[A[i]];
        Map[A[i]]=i;
    }
    int l=1;
    int Ans=0;
    for(int i=1;i<=n;i++){
        Add(A[i]);
        while(cnt-1>k){
            Del(A[l]);
            l++;
        }
        Ans=max(Ans,ha[M[A[i]]]);
    }
    cout<return 0;
}

你可能感兴趣的:(杂题)