给出 n n n个岛屿的高度,询问 q q q个海平面,每个海平面时存在多少岛屿。
对询问和岛屿分别离散化,对于每一个询问,他之前的询问一定把更矮的岛给覆盖了,所以对于一个询问,覆盖当前没覆盖的岛对答案的影响分两种:1、在原序列中这个岛两边的岛都没被覆盖过,那么答案+1;2、在原序列中这个岛两边都被覆盖过了,那么答案被多加了1,所以答案-1。
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<cstring>
#include<stack>
#define mem(ss) memset(ss,0,sizeof(ss))
#define rep(d, s, t) for(int d=s;d<=t;d++)
#define rev(d, s, t) for(int d=s;d>=t;d--)
#define inf 0x3f3f3f3f
typedef long long ll;
typedef long double ld;
typedef double db;
typedef std::pair<int, int> pii;
typedef std::pair<ll, ll> pll;
const ll mod = 1e9 + 7;
const int N = 5e5 + 10;
#define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
struct node {
int h, id;
bool operator<(const node &rhs) const {
return h > rhs.h;
}
} a[N], b[N];
bool vis[N];
int ans[N], n, q;
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i].h);
a[i].id = i;
}
for (int i = 1; i <= q; i++) {
scanf("%d", &b[i].h);
b[i].id = i;
}
sort(a + 1, a + n + 1);
sort(b + 1, b + n + 1);
int pos = 1, cnt = 0;
for (int i = 1; i <= n; i++) {
while (pos <= n && a[pos].h > b[i].h) {
vis[a[pos].id] = 1;
if (!vis[a[pos].id - 1] && !vis[a[pos].id + 1])cnt++;
if (vis[a[pos].id - 1] && vis[a[pos].id + 1])cnt--;
pos++;
}
ans[b[i].id] = cnt;
}
for (int i = 1; i <= q; i++)
printf("%d\n", ans[i]);
return 0;
}