题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1276
题意:中文题诶~
思路:xjb
通过画图可以发现对于当前水没过的点,若其为极小值点,则岛屿数目-1,若为极大值点则岛屿数目+1;
可以给海面高度排序,海面高度单调时岛屿的状态也是连续的。
可以给山峰高度排序,避免对于每一个高度海面都遍历一遍才能找到被淹没的山峰。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <map> 6 using namespace std; 7 8 const int MAXN=1e5+10; 9 10 struct node{ 11 int value, num; 12 }gg[MAXN]; 13 14 int a[MAXN], b[MAXN], value[MAXN]; 15 map<int, int> mp; 16 17 bool cmp(node a, node b){ 18 return a.value<b.value; 19 } 20 21 int main(void){ 22 int n, m, ans=1; 23 scanf("%d%d", &n, &m); 24 for(int i=0; i<n; i++){ 25 scanf("%d", &gg[i].value); 26 gg[i].num=i; 27 value[i]=gg[i].value; 28 } 29 for(int i=0; i<m; i++){ 30 scanf("%d", &a[i]); 31 } 32 memcpy(b, a, sizeof(a)); 33 sort(gg, gg+n, cmp); 34 sort(a, a+m); 35 int indx=0; 36 for(int i=0; i<m; i++){ 37 while(gg[indx].value<=a[i]&&indx<n){ 38 int cc=gg[indx].num; 39 if(cc==0||cc==n-1){//注意边界情况 40 if(cc==0){ 41 if(value[cc]>value[cc+1]) ans--; 42 }else{ 43 if(value[cc]>value[cc-1]) ans--; 44 } 45 }else{ 46 if(value[cc]<value[cc-1]&&value[cc]<value[cc+1]){ 47 ans++; 48 }else if(value[cc]>value[cc-1]&&value[cc]>value[cc+1]){ 49 ans--; 50 } 51 } 52 indx++; 53 } 54 mp[a[i]]=ans; 55 } 56 for(int i=0; i<m; i++){ 57 printf("%d ", mp[b[i]]); 58 } 59 return 0; 60 }