hdu5247 找連續數

2021-07-03 04:47:18 字數 1257 閱讀 3759

problem description

小度熊拿到了乙個無序的陣列,對於這個陣列,小度熊想知道是否能找到乙個k 的區間,裡面的 k 個數字排完序後是連續的。

現在小度熊增加題目難度,他不想知道是否有這樣的 k 的區間,而是想知道有幾個這樣的 k 的區間。

input

輸入包含一組測試資料。

第一行包含兩個整數n,m,n代表陣列中有多少個數字,m 代表針對於此陣列的詢問次數,n不會超過10的4次方,m 不會超過1000。第二行包含n個正整數,第 i 個數字代表無序陣列的第 i 位上的數字,數字大小不會超過2的31次方。接下來 m 行,每行乙個正整數 k,含義詳見題目描述,k 的大小不會超過1000。

output

第一行輸"case #i:"。(由於只有一組樣例,只輸出」case #1:」即可)

然後對於每個詢問的 k,輸出一行包含乙個整數,代表陣列中滿足條件的 k 的大小的區間的數量。

sample input

6 2

3 2 1 4 3 534

sample output

case #1:

2

這題因為詢問有1000次,所以轉化為離線操作,先把所有的詢問儲存起來並找到詢問區間長度的最大值,然後列舉尋找的區間起點,對於每個起點尋找是不是有連續k個數迴圈的區間。找到的判斷條件:1.區間所有數都不同。2.區間的最大值減去最小值加1的值為區間的長度。可以用map判斷是否出現相同的數,如果出現可以直接跳出迴圈,因為後面更大的區間長度肯定不滿足。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

int q[1006],a[100006],sum[1006];

int main()

maxx=0;

memset(sum,0,sizeof(sum)); //連續i個數的總區間個數

for(i=1;i<=m;i++)

for(i=1;i<=n;i++){

maphash;

hash.clear();

min1=max1=a[i];

for(j=1;j<=maxx && i+j-1<=n;j++){

if(hash[a[i+j-1]]==0){

hash[a[i+j-1]]++;

if(min1>a[i+j-1])min1=a[i+j-1];

else if(max1

hdu 5247 找連續數

problem description 小度熊拿到了乙個無序的陣列,對於這個陣列,小度熊想知道是否能找到乙個k 的區間,裡面的 k 個數字排完序後是連續的。現在小度熊增加題目難度,他不想知道是否有這樣的 k 的區間,而是想知道有幾個這樣的 k 的區間。input 輸入包含一組測試資料。第一行包含兩個...

hdu5247找連續數

小度熊拿到了乙個無序的陣列,對於這個陣列,小度熊想知道是否能找到乙個k 的區間,裡面的 k 個數字排完序後是連續的。現在小度熊增加題目難度,他不想知道是否有這樣的 k 的區間,而是想知道有幾個這樣的 k 的區間。input 輸入包含一組測試資料。第一行包含兩個整數n,m,n代表陣列中有多少個數字,m...

hdu5247 找連續數

problem description 小度熊拿到了乙個無序的陣列,對於這個陣列,小度熊想知道是否能找到乙個k 的區間,裡面的 k 個數字排完序後是連續的。現在小度熊增加題目難度,他不想知道是否有這樣的 k 的區間,而是想知道有幾個這樣的 k 的區間。input 輸入包含一組測試資料。第一行包含兩個...