題目
有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如:島嶼的高度為:, 查詢為:。當海面高度為0時,所有的島形成了1個島嶼。當海面高度為1時,島1會被淹沒,總共有2個島嶼 。當海面高度為3時,所有島都會被淹沒,總共0個島嶼。當海面高度為2時,島0, 1, 3會被淹沒,總共有2個島嶼 。
輸入
第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)。
輸出
輸出共q行,對應每個查詢的島嶼數量。
樣例輸入
5 421
3230
132
樣例輸出
120
2
分析
如果是孤立的島嶼,它被淹沒後總數減一;如果它左邊和右邊相鄰的島嶼都沒被淹沒,它被淹沒後,總數加一;使用排序進行優化,具體看程式。
c++程式
#include#include#includeusing namespace std;
const int n=50005;
struct island
}a[n];
struct query
}q[n];
int ans[n],v[n];//v[i]=true表示島嶼i被淹沒
int main()
for(int i=0;isort(a,a+n);
sort(q,q+q);
int sum=1,j=0;
for(int i=0;ielse if(a[j].id==n-1)
else
v[a[j].id]=1;
j++;
} ans[q[i].id]=sum;
} for(int i=0;icout
}
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時,海上共有多少個島嶼。例如 島嶼的高度為 ...