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