题目大意:有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;
}