第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 4 2 1 3 2 3 0 1 3 2
1 2 0 2
这样思路就很清晰了,对a,b数组排序,先淹没小的岛屿,再淹没大的岛屿。
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; struct node { int high,zuo; bool operator <(const node b)const { return high<b.high; } }p[100000],Q[100000]; int ans[100000]; int vis[1000000]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { scanf("%d",&p[i].high); p[i].zuo=i; } for(int i=0;i<m;i++) { scanf("%d",&Q[i].high); Q[i].zuo=i; } sort(p,p+n); sort(Q,Q+m); int cnt=1,j=0; for(int i=0;i<m;i++) { while(p[j].high<=Q[i].high&&j<n) { if(p[j].zuo==0) ///最左侧的 { if(vis[1]) /// cnt--; } else if(p[j].zuo==n-1) ///最右侧 { if(vis[n-2]) cnt--; } else { if(vis[p[j].zuo-1]&&vis[p[j].zuo+1]) ///两边都被淹没了 cnt--; else if(!vis[p[j].zuo-1]&&!vis[p[j].zuo+1]) ///两边都没被淹没 cnt++; } vis[p[j].zuo]=1; j++; } ans[Q[i].zuo]=cnt; } for(int i=0;i<m;i++) { printf("%d\n",ans[i]); } } return 0; }