真的不难这个题,不需要算法
想到用结构体对高度排序,记录位置就不难了,但是 更重要的是 注意后续计算岛屿数量
我就是在计算数量的时候很sb,没有想清楚,写了以后,一点一点的改,虽然最后改对了,但是很费时间。。。当然最后真的是参考了AC代码才想到哪里有问题的
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 100000 + 7;
int n, Q;
int vis[maxn], an[maxn];
struct node {
int h;
int index;
}a[maxn];
struct chike {
int h;
int index;
}b[maxn];
int cmp(node a, node b) {
return a.h < b.h;
}
int cmp1(chike a, chike b) {
return a.h < b.h;
}
void init() {
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i].h);
a[i].index = i;
vis[i] = 0;
}
sort(a+1, a+n+1, cmp);
for(int i = 1; i <= Q; ++i) {
scanf("%d", &b[i].h);
b[i].index = i;
}
sort(b+1, b+Q+1, cmp1);
}
void solve() {
//memset(vis, 0, sizeof vis);
vis[0] = 1; vis[n+1] = 1;
int ans = 1, max_ = 0;
int i = 1;
for(int j = 1; j <= Q; ++j) {
if(max_ >= b[j].h) {an[b[j].index] = ans;}
else {
max_ = b[j].h;
while(i <= n && a[i].h <= b[j].h) {
if(vis[a[i].index]) {i++; continue; }
if( !vis[a[i].index-1] && !vis[a[i].index+1]) ans++;
if( vis[a[i].index-1] && vis[a[i].index+1]) ans--;
vis[a[i].index] = 1; i++;
}
an[b[j].index] = ans;
}
}
for(int i = 1; i <= Q; ++i) {
printf("%d\n", an[i]);
}
}
int main() {
while(~scanf("%d%d", &n, &Q)) {
init();
solve();
}
return 0;
}