1. 程式人生 > >bzoj3048[Usaco2013 Jan]Cow Lineup 尺取法

bzoj3048[Usaco2013 Jan]Cow Lineup 尺取法

def while bbs detail 顏色 search ssi tail imp

3048: [Usaco2013 Jan]Cow Lineup

Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 225 Solved: 159
[Submit][Status][Discuss]

Description

Farmer John‘s N cows (1 <= N <= 100,000) are lined up in a row. Each cow is identified by an integer "breed ID" in the range 0...1,000,000,000; the breed ID of the ith cow in the lineup is B(i). Multiple cows can share the same breed ID. FJ thinks that his line of cows will look much more impressive if there is a large contiguous block of cows that all have the same breed ID. In order to create such a block, FJ chooses up to K breed IDs and removes from his lineup all the cows having those IDs. Please help FJ figure out the length of the largest consecutive block of cows with the same breed ID that he can create by doing this.

給你一個長度為n(1<=n<=100,000)的自然數數列,其中每一個數都小於等於10億,現在給你一個k,表示你最多可以刪去k類數。數列中相同的數字被稱為一類數。設該數列中滿足所有的數字相等的連續子序列被叫做完美序列,你的任務就是通過刪數使得該數列中的最長完美序列盡量長。

Input

* Line 1: Two space-separated integers: N and K.
* Lines 2..1+N: Line i+1 contains the breed ID B(i).

Output


* Line 1: The largest size of a contiguous block of cows with identical breed IDs that FJ can create.

Sample Input

9 1
2
7
3
7
7
3
7
5
7

INPUT DETAILS: There are 9 cows in the lineup, with breed IDs 2, 7, 3, 7, 7, 3, 7, 5, 7. FJ would like to remove up to 1 breed ID from this lineup.

Sample Output

4

OUTPUT DETAILS: By removing all cows with breed ID 3, the lineup reduces to 2, 7, 7, 7, 7, 5, 7. In this new lineup, there is a contiguous block of 4 cows with the same breed ID (7).

HINT

樣例解釋:
長度為9的數列,最多只能刪去1類數。
不刪,最長完美序列長度為2.
刪去一類數3,序列變成2 7 7 7 7 5 7,最長完美序列長度為4.因此答案為4.

Source

Gold

尺取法
記錄區間內每個元素出現次數和顏色種數
當種數<=k+1時r++,當種數>k+1時l++

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define N 100005
 6 using namespace std;
 7 int n,m,ans,num,a[N],b[N],cnt[N];
 8 int main(){
 9     scanf("%d%d",&n,&m);
10     for(int i=1;i<=n;i++)
11     scanf("%d",&a[i]),b[i]=a[i];
12     sort(b+1,b+1+n);
13     int len=unique(b+1,b+1+n)-b-1;
14     for(int i=1;i<=n;i++)
15     a[i]=lower_bound(b+1,b+1+len,a[i])-b;
16     int l=1,r=1;cnt[a[1]]++;num++;
17     while(r<n){
18         while(r<n&&num<=m+1){
19             if(!cnt[a[++r]])num++;
20             cnt[a[r]]++;
21             ans=max(ans,cnt[a[r]]);
22         }
23         while(num>m+1&&l<=r)
24         if(!(--cnt[a[l++]]))num--; 
25     }
26     printf("%d\n",ans);
27     return 0;
28 }

bzoj3048[Usaco2013 Jan]Cow Lineup 尺取法