51Nod 1276 岛屿的数量
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 8 const int MAXN = 5e4+5; 9 struct node 10 { 11 int pos, val; 12 }; 13 node a[MAXN], q[MAXN]; 14 15 bool cmp(node a, node b) 16 { 17 return a.val < b.val; 18 } 19 20 bool vis[MAXN]; 21 int ans[MAXN]; 22 23 int main() 24 { 25 int N, Q; 26 while(~scanf("%d%d",&N,&Q)) 27 { 28 memset(vis, 0, sizeof(vis)); //没被淹没 29 for(int i=0; i<N; i++) 30 { 31 scanf("%d",&a[i].val); 32 a[i].pos = i; 33 } 34 for(int i=0; i<Q; i++) 35 { 36 scanf("%d",&q[i].val); 37 q[i].pos = i; 38 } 39 sort(a, a+N, cmp); 40 sort(q, q+Q, cmp); 41 int sum = 1, j = 0 ; 42 for(int i=0; i<Q; i++) 43 { 44 while(a[j].val <= q[i].val && j<N) 45 { 46 //判断是不是第一个点 47 if(a[j].pos == 0) 48 { 49 if(vis[1]) //被淹没 50 sum--; 51 } 52 //判断是不是最后一个点 53 else if(a[j].pos == N-1) 54 { 55 if(vis[N-2]) 56 sum--; 57 } 58 else 59 { 60 if(vis[a[j].pos-1] && vis[a[j].pos+1])//山峰 61 sum--; 62 else if(!vis[a[j].pos-1] && !vis[a[j].pos+1])//山谷 63 sum++; 64 } 65 vis[a[j].pos] = 1; //标记被淹没 66 j++; 67 } 68 ans[q[i].pos] = sum; 69 } 70 for(int i=0; i<Q; i++) 71 printf("%d\n",ans[i]); 72 } 73 return 0; 74 }