有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 <= aii <= 10^9)。
第n + 2 - n + q + 1行,每行乙個數,對應查詢的海平面高度(1 <= qii <= 10^9)。
output
輸出共q行,對應每個查詢的島嶼數量。
看了別人的**,有詳細的解題思路,覺得清晰易懂,鏈結
#include #include #include #include #include using namespace std;
const int maxn = 5e4+5;
struct node
;node a[maxn], q[maxn];
bool cmp(node a, node b)
bool vis[maxn];
int ans[maxn];
int main()
for(int i=0; isort(a, a+n, cmp);
sort(q, q+q, cmp);
int sum = 1, j = 0 ;
for(int i=0; i///判斷是不是最後乙個點
else if(a[j].pos == n-1)
///中間的點
else
vis[a[j].pos] = 1;///標記被淹沒過的點..
j++;
}ans[q[i].pos] = sum;
}for(int i=0; iprintf("%d\n",ans[i]);
}return 0;
}
島嶼的數量(思維)
題目 有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如 島嶼的高...
51Nod 1276 島嶼的數量 思維
題目 有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如 島嶼的高...
51nod 1276 島嶼的數量(思維題)
有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如 島嶼的高度為 ...