necklace
題目描述
可憐的dog最終還是難逃厄運,被迫于lxy簽下城下之約。這時候lxy開始刁難dog。
Lxy首先向dog炫耀起了自己的財富,他拿出了一段很長的項鏈。這個項鏈由n個珠子按順序連在一起(1號珠子和n號珠子沒有相連),每個珠子的顏色是1..m中的一種顏色(不妨用Ai表示第i個珠子的顏色)。
可dog當然不肯服氣,于是他認為一定可以找到一段長度<=len的項鏈b1..blen(bi也是1..m中的一種顏色),沒有出現過。
出現過的定義就是存在一組C1..Cm滿足0<C1<C2<..<Cm<=n使得Aci=Bi。
然后lxy就要dog找出一段長度<=len的項鏈沒有出現過。這時候dog發現自己中計了,因為項鏈太長了而lxy規定的len卻很小。于是他又來找你求助了。不然的話,dog就要被迫簽下賣國條約了……..現在就請你幫dog沒有出現過的項鏈中最短的長度。
輸入輸出
輸入文件:
第1行2個數n,m。接下來n行,每行一個數表示Ai。
輸出文件:
一個數,沒有出現過的項鏈中最短的長度。
樣例
輸入
2 3
1
2
輸出
1
說明
樣例解釋
B1=3沒有出現過,所以有長度為1,顏色為3的項鏈滿足條件。
數據范圍
100%的數據中,n<=500000,m<=100.
40%的數據中,n<=100,m<=3.
10%的數據中,n<=10,m<=2.
思路
給你一個長度為N的序列A1..An。其中Ai的取值范圍[1,m]。要求一個最短長度Len,滿足存在一個序列長度為Len的B1..Blen,這個序列在Ai中沒有出現過。
我們思考假設在從最左端開始的一段區間范圍內,如果存在1~m中間的所有數字,那么Len至少大于1。
假設緊跟這個區間之后又有一段數字包含了1~M。那么對于所有長度為2的序列就都已經存在,也就是Len要大于2。
以此類推,若整個Ai序列中以此有K個存在1~M的區間
- 而在k個1~M的區間之后,已經不會滿足存在1 ~M中間的所有數字,那么Ans=K+1。
代碼
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,ans;
int c[501000],h[500];
int main(){
freopen("necklace.in ","r",stdin);
freopen("necklace.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&c[i]);
int time=1,j=m;
for(int i=1;i<=n;i++)
if(h[c[i]]!=time){
h[c[i]]=time; j--;
if(j==0) {
ans++;time++;j=m;
}
}
printf("%d",ans+1);
return 0;
}