emiya面前的n朵花按直線排列,一共m種花朵,花的種類用1,2,3…m-1,m的數字進行編號..
emiya想知道的是,最少連續多少朵花,可以包含前1~k種類花朵每種至少一次.
第一行包含乙個整數t,表示測試的組數, 1≤t≤10
接下來是t組資料:
每組的第一行包含3個整數n,m,k 其中1 <= n,m <= 10^5,1 <= k <= m
接下來一行包含n個整數,表示按直線排列的n朵花.
每一組資料輸出一行,
包含乙個整數包含,即為所求的答案.,如果不存在答案 則輸出-1
輸入
35 5 3
1 2 3 4 5
5 5 3
1 2 1 2 1
5 4 3
1 2 4 3 1輸出3
-14尺取法板子題,不解釋了。和 poj - 3320 這道題方法一樣
poj - 3320 鏈結
#include#include #include#include#include using namespace std;
const int maxn=1e5+10;
int a[maxn];
int main()
int ans=1000000;
int r=0,l=0,cnt=0;
while(true)
if(cntans=min(ans,r-l);
mm[a[l]]--;
if(mm[a[l]]==0&&a[l]<=k) cnt--;
l++;
}if(ans==1000000)else
}return 0;
}
常用的解題技巧 尺取法
尺取法 顧名思義,像尺子一樣取一段,借用挑戰書上面的話說,尺取法通常是對陣列儲存一對下標,即所選取的區間的左右端點,然後根據實際情況不斷地推進區間左右端點以得出答案。之所以需要掌握這個技巧,是因為尺取法比直接暴力列舉區間效率高很多,尤其是資料量大的時候,所以尺取法是一種高效的列舉區間的方法,一般用於...
關於尺取法的一些例子
最近做了一些關於尺取法的題,大概明白了一些套路。首先固定左端點,不斷地去取右端點,直到區間盡頭或者不滿足條件,然後判斷是否滿足條件,如果不滿足條件一般情況下是到了盡頭,然後去最值,然後刪去乙個左端點再在新的乙個左端點上不斷地去取右端點,這樣整個演算法的複雜度為o n poj 3061 尺取法版本 i...
尺取法 最短的包含字串
給出乙個字串,求該字串的乙個子串s,s包含a z中的全部字母,並且s是所有符合條件的子串中最短的,輸出s的長度。如果給出的字串中並不包括a z中的全部字母,則輸出no solution。input 第1行1個字串。字串的長度 100000。output 輸出包含a z的最短子串長度。如果沒有符合條件...