51nod 1276 島嶼的數量 離線演算法亂搞

2021-08-04 15:18:58 字數 1357 閱讀 6825

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

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

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

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

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

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

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

對於單次查詢,直接去檢查的話,單次複雜度是o(

n),肯定會超時,我們可以發現海平面高度較高時,海平面較低時能淹沒的島嶼,此時肯定也會被淹沒,也就是說可以從海平面高度較低時向較高時進行狀態的轉移。於是可以設計乙個離線演算法,首先把島嶼高度和海平面高度離散化,然後把詢問按從小到大排序,就可以方便的進行轉移了

#include 

using

namespace

std;

const

int n = 50000 + 10, inf = 0x3f3f3f3f;

struct node

}arr[n], brr[n];

int a[n+n], ans[n];

bool vis[n];

int main()

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

sort(a + 1, a + 1 + k);

k = unique(a + 1, a + 1 + k) - a - 1;

for(int i = 1; i <= n; i++) arr[i].x = lower_bound(a + 1, a + 1 + k, arr[i].x) - a;

for(int i = 1; i <= m; i++) brr[i].x = lower_bound(a + 1, a + 1 + k, brr[i].x) - a;

sort(arr + 1, arr + 1 + n);

sort(brr + 1, brr + 1 + m);

int num = 1, en = 1;

memset(vis, 0, sizeof vis);

vis[0] = vis[n+1] = true;//首尾做標記,避免特判首尾

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

ans[brr[i].idx] = num;

}for(int i = 1; i <= m; i++) printf("%d\n", ans[i]);

return

0;}

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時,海上共有多少個島嶼。例如 島嶼的高...