51nod 1276 岛屿的数量 (离散化)

给出 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值