F 島嶼的數量

2021-08-25 19:21:28 字數 1269 閱讀 8353

有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。

給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如:

島嶼的高度為:, 查詢為:。

當海面高度為0時,所有的島形成了1個島嶼。

當海面高度為1時,島1會被淹沒,總共有2個島嶼 。

當海面高度為3時,所有島都會被淹沒,總共0個島嶼。

當海面高度為2時,島0, 1, 3會被淹沒,總共有2個島嶼 。

input

第1行:2個數n, q中間用空格分隔,其中n為島的數量,q為查詢的數量(1 <= n, q <= 50000)。

第2 - n + 1行,每行1個數,對應n個島嶼的高度(1 <= a[i] <= 10^9)。 

第n + 2 - n + q + 1行,每行乙個數,對應查詢的海平面高度(1 <= q[i] <= 10^9)。

output

輸出共q行,對應每個查詢的島嶼數量。

sample input

5 421

3230

132

sample output

120

2

#include#include#include#includeusing namespace std;

const int maxn=5e4+5;

struct node

a[maxn],b[maxn];

bool flag[maxn];//標記島嶼是否被淹沒

int ans[maxn];//ans[i]表示海平面為i時島嶼的數量

bool cmp(node x,node y)

int main()

for(int i=0;isort(a,a+n,cmp);

sort(b,b+q,cmp);

int cnt=1,j=0;

memset(flag,false,sizeof(flag));

for(int i=0;ielse if(a[j].pos==n-1)//當前島嶼的位置為最後乙個

else//在中間

flag[a[j++].pos]=true;//第j個島嶼被淹沒

}ans[b[i].pos]=cnt;

}for(int i=0;iprintf("%d\n",ans[i]);

return 0;

}

島嶼的數量(思維)

題目 有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如 島嶼的高...

島嶼的數量 (思維)

有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如 島嶼的高度為 ...

計算島嶼的數量

給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。例 1 輸入 4 5 11110 11010 11000 00000 輸出 1例2 輸入 4 5 11000 11000 001...