线段树+离散化20分求调!
查看原帖
线段树+离散化20分求调!
1042486
larryia楼主2024/8/11 20:11
#include <bits/stdc++.h>
#define lc (u << 1)
#define rc (u << 1 | 1)
using namespace std;
const int M = 1005;
int n, m, a[M], b[M], num[M << 2], vis[M], ans = 0;
void rnk() {
    sort(num + 1, num + m * 2 + 1);
    int idx = 1, cnt;
    for (int i = 2; i <= m * 2; i++) {
        if (num[idx] != num[i]) {
            num[++idx] = num[i];
        }
    }
    cnt = idx;
    for (int i = 2; i <= idx; i++) {
        if (num[i] - num[i - 1] > 1) {
            num[++cnt] = num[i - 1] + 1;
        }
    }
    sort(num + 1, num + cnt + 1);
    for (int i = 1; i <= m; i++) {
        a[i] = lower_bound(num, num + cnt + 1, a[i]) - num;
        b[i] = lower_bound(num, num + cnt + 1, b[i]) - num;
    }
}
struct segtree {
    int l, r, tag;
}tr[M << 4];
void build(int u, int l, int r) {
    tr[u] = {l, r, 0};
    if (l == r) return;
    int mid = (l + r) >> 1;
    build(lc, l, mid);
    build(rc, mid + 1, r);
}
void pushdown(int u) {
    if (tr[u].tag) {
        tr[lc].tag = tr[u].tag;
        tr[rc].tag = tr[u].tag;
        tr[u].tag = 0;
    }
}
void update(int u, int l, int r, int k) {
    if (tr[u].l > r || tr[u].r < l) return;
    if (l <= tr[u].l && tr[u].r <= r) {
        tr[u].tag = k;
        return;
    }
    pushdown(u);
    update(lc, l, r, k);
    update(rc, l, r, k);
}
void query(int u) {
    if (tr[u].l == tr[u].r) {
        if (tr[u].tag && !vis[tr[u].tag]) {
            vis[tr[u].tag] = 1;
            ans++;
        } 
        return;
    }
    pushdown(u);
    query(lc);
    query(rc);
}
int main() {
    cin >> n >> m;
    build(1, 1, m * 2);
    for (int i = 1; i <= m; i++) {
        cin >> a[i] >> b[i];
        num[i] = a[i];
        num[i + m] = b[i];
    }
    rnk();
    for (int i = 1; i <= m; i++) {
        update(1, a[i], b[i], i);
    }
    query(1);
    cout << ans;
    return 0;
}
2024/8/11 20:11
加载中...