题目大意:有n件物体,每件物体都有相应的l,r,h
l代表该物体的最左端
r代表物体的最右端
h代表该物体的高度
现在要求这些物体的覆盖区间和,覆盖表示在后面这些物体还没到来时,当前这个物体在(l,r)的区间内高度是h的的占多少

解题思路:维护两个值max和min,模版题

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int Maxn = 100000 << 2;
int Max[Maxn],Min[Maxn], node[Maxn], setv[Maxn], sum;

void pushUp(int u, int L, int R) {

    int l = 2 * u, r = 2 * u + 1;
    if(L < R) {
        Max[u] = max(Max[l],Max[r]);
        Min[u] = min(Min[l],Min[r]);
    }

    if(setv[u] != -1) {
        Min[u] = setv[u];
        Max[u] = setv[u];
    }
}

void pushDown(int u) {
    if(setv[u] != -1) {
        setv[2 * u] = setv[2 * u + 1] = setv[u];
        setv[u] = -1;
    } 
}

void query(int u, int l, int r, int L, int R, int h) {

    bool flag = false;
    if(L <= l && r <= R) {
        if(Max[u] <= h) {
            setv[u] = h;
            sum += r - l + 1;
            pushUp(u, l, r);
            flag = true;
        }
        else if(Min[u] > h || l == r)
            flag = true;
        if(flag)
            return ;
    }
    int mid = (l + r) / 2;  
    pushDown(u);
    pushUp(2 * u, l, mid);
    pushUp(2 * u + 1, mid + 1, r);
    if(L <= mid)
        query(u * 2, l, mid, L, R, h);
    if(R > mid)
        query(u * 2 + 1, mid + 1, r, L, R, h);
    pushUp(u,l,r);
}

int main() {
    int test, n, l, r, h;
    scanf("%d", &test);
    while(test--) {
        int ans = 0;
        scanf("%d", &n);
        memset(Max,0,sizeof(Max));
        memset(Min,0,sizeof(Min));
        memset(setv,-1,sizeof(setv));
        while(n--) {
            scanf("%d%d%d", &l, &r, &h);
            sum = 0;
            query(1,1,100005,l,r-1,h);
            ans += sum;
        }
        printf("%d\n",ans);
    }
    return 0;
}