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<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<map>
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<<Ans;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章