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

给出 n n n个岛屿的高度,询问 q q q个海平面,每个海平面时存在多少岛屿。

对询问和岛屿分别离散化,对于每一个询问,他之前的询问一定把更矮的岛给覆盖了,所以对于一个询问,覆盖当前没覆盖的岛对答案的影响分两种:1、在原序列中这个岛两边的岛都没被覆盖过,那么答案+1;2、在原序列中这个岛两边都被覆盖过了,那么答案被多加了1,所以答案-1。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#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;
}

你可能感兴趣的:(离散化)