线段树求条,悬 13 关!
查看原帖
线段树求条,悬 13 关!
482998
jeffstart楼主2024/6/16 00:21

rt.

代码:

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

const int N = 1e6 + 10;
int l[N], r[N], x[N];
int n, q;

struct S {
    int l, r, x;
} a[N], tmp[N];

struct node {
    int l, r;
    int sum, add;
} tr[N * 4];

void pushup(node &u, node &l, node &r) { u.sum = l.sum + r.sum; }

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, 0};
    } else {
        tr[u] = {l, r, 0, 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.sum = (l.r - l.l + 1) * u.add;
        r.sum = (r.r - r.l + 1) * u.add;
        u.add = 0;
    }
}

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

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

int comp(S a, S b) {
    if (a.x != b.x) {
        return a.x > b.x;
    } else {
        return a.l < b.l;
    }
}

bool check(int x) {
    for (int i = 1; i <= x; i++) {
        tmp[i] = a[i];
    }
    sort(tmp + 1, tmp + x + 1, comp);
    for (int i = 1; i <= x;) {
        int j = i;
        while (j <= x && tmp[j].x == tmp[i].x) {
            j++;
        }
        int ul, nl, ur, nr;
        ul = nl = tmp[i].l, ur = nr = tmp[i].r;
        for (int k = i + 1; k < j; k++) {
            ul = min(tmp[k].l, ul);
            ur = max(tmp[k].r, ur);
            nl = max(tmp[k].l, nl);
            nr = min(tmp[k].r, nr);
        }
        if (nl > nr) {
            return false;
        }
        if (query(1, nl, nr) == nr - nl + 1) {
            return false;
        }
        modify(1, ul, ur, 1);
        i = j;
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n >> q;
    for (int i = 1; i <= q; i++) {
        cin >> a[i].l >> a[i].r >> a[i].x;
    }
    build(1, 1, n);
    // cout << check(3) << "\n";
    int l = 1, r = q + 1;
    while (l < r) {
        int mid = (l + r) / 2;
        if (check(mid)) {
            l = mid + 1;
        } else {
            r = mid;
        }
    }
    cout << (r == q + 1 ? 0 : r) << "\n";
    return 0;
}

目前过不了样例/kk

2024/6/16 00:21
加载中...