51nod1276(xjb)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1276

 

题意:中文题诶~

 

思路:xjb

通过画图可以发现对于当前水没过的点,若其为极小值点,则岛屿数目-1,若为极大值点则岛屿数目+1;

可以给海面高度排序,海面高度单调时岛屿的状态也是连续的。

可以给山峰高度排序,避免对于每一个高度海面都遍历一遍才能找到被淹没的山峰。

 

代码:

 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\n", mp[b[i]]);
58     }
59     return 0;
60 }
View Code

 

posted @ 2017-04-10 18:10  geloutingyu  阅读(143)  评论(0编辑  收藏  举报