51nod 1276 島嶼的數量 神奇做法

2021-08-10 15:58:24 字數 1772 閱讀 6268

有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行,對應每個查詢的島嶼數量。
input示例

5 421

3230

132

output示例

120

把島嶼和海平面都從小到大排序,這樣有兩個好處。

對於某乙個海平面,我們碰到當前島嶼超過了,那麼就不需要往後找了。

對於某乙個島嶼,如果之前海平面超過了,那麼標記一下,現在海平面可以不用管當前這個島了。

建立乙個sum=1,代表當前大島的個數。

之後對於某乙個海平面,從某個島開始列舉。

如果當前島在最左邊,我們看看第二個島是否被淹了,如果被淹了,那麼sum-1.沒被淹,那就不做處理。

如果當前島在最右邊,我們看看倒數第二個島是否被淹了,如果被淹了,那麼sum-1,否則不做處理

如果當前島在中間地區,我們看看這個島兩邊的兩個島是否被淹,如果都被淹了,那麼sum--,如果都沒被淹,那麼sum++

之後標記一下這個島被淹了。繼續看下乙個島的情況。

直到某個島不會被淹位置,記錄當前海平面sum的值。

#include #include #include #include #include using namespace std;

struct node

daoyu[51000],haipingmian[51000];

bool cmp(node t1,node t2)

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

sort(daoyu+1,daoyu+1+n,cmp);

sort(haipingmian+1,haipingmian+1+m,cmp);

memset(ans,0,sizeof(ans));

memset(vis,0,sizeof(vis));

long long sum=1;

long long dao=1;

for(long long i=1;i<=m;i++)//每乙個海平面

}else if(daoyu[dao].id==n)//如果當前島是最後乙個的話

}else

else if(!vis[daoyu[dao].id-1]&&!vis[daoyu[dao].id+1])//都沒淹

}vis[daoyu[dao].id]=1;

dao++;//判斷下乙個島

}ans[haipingmian[i].id]=sum;

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

}

51Nod 1276 島嶼的數量

1276 島嶼的數量 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n...

51nod1276島嶼的數量

1276 島嶼的數量 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有...

51Nod 1276 島嶼的數量 思維

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