扫描线求条,悬 3 关!
  • 板块学术版
  • 楼主jeffstart
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/14 23:43
  • 上次更新2024/6/15 11:23:09
查看原帖
扫描线求条,悬 3 关!
482998
jeffstart楼主2024/6/14 23:43

rt.

题目:

本人代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

struct NODE {
    int l, r;
    int min_v, tot, add;
} tr[N * 4];

void pushup(NODE &u, NODE &l, NODE &r) {
    u.min_v = min(l.min_v, r.min_v);
    if (l.min_v < r.min_v) {
        u.tot = l.tot;
    } else if (l.min_v > r.min_v) {
        u.tot = r.tot;
    } else {
        u.tot = l.tot + r.tot;
    }
}

void pushup(int u) { pushup(tr[u], tr[u * 2], tr[u * 2 + 1]); }

void build(int u, int l, int r) {
    if (l == r) {
        tr[u] = {l, r, 0, 1, 0};
    } else {
        tr[u] = {l, r, 0, 1, 0};
        int mid = (l + r) / 2;
        build(u * 2, l, mid);
        build(u * 2 + 1, mid + 1, r);
        pushup(u);
    }
}

void pushdown(int x) {
    NODE &u = tr[x], &l = tr[x * 2], &r = tr[x * 2 + 1];
    if (u.add) {
        l.add += u.add;
        r.add += u.add;
        l.min_v += u.add;
        r.min_v += u.add;
        u.add = 0;
    }
}

NODE query(int u, int l, int r) {
    if (tr[u].l >= l && tr[u].r <= r) {
        return tr[u];
    } else {
        pushdown(u);
        int mid = (tr[u].l + tr[u].r) / 2;
        if (mid >= r) {
            return query(u * 2, l, r);
        } else if (mid < r) {
            return query(u * 2 + 1, l, r);
        } else {
            NODE res1 = query(u * 2, l, r);
            NODE res2 = query(u * 2 + 1, l, r);
            NODE ans;
            pushup(ans, res1, res2);
            return ans;
        }
    }
}

void modify(int u, int l, int r, int d) {
    if (tr[u].l >= l && tr[u].r <= r) {
        tr[u].min_v += d;
        tr[u].add += d;
    } else {
        pushdown(u);
        int mid = (tr[u].l + tr[u].r) / 2;
        if (mid >= l) {
            modify(u * 2, l, r, d);
        }
        if (mid < r) {
            modify(u * 2 + 1, l, r, d);
        }
        pushup(u);
    }
}

struct node {
    int L, R, d;
};

vector<node> vec[N];

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int X1, Y1, X2, Y2;
        cin >> X1 >> Y1 >> X2 >> Y2;
        vec[X1].push_back({Y1, Y2, 1});
        vec[X2 + 1].push_back({Y1, Y2, -1});
    }
    build(1, 1, 10);
    int ans = 0;
    for (int i = 1; i <= 6; i++) {
        for (auto x : vec[i]) {
            modify(1, x.L, x.R, x.d);
        }
        ans += query(1, 1, N - 1).tot;
    }
    cout << ans << "\n";
    return 0;
}
2024/6/14 23:43
加载中...