继续线段树,WA了好久~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1000001;
struct node
{
int l;
int r;
int h;
bool flag;
}t[maxn*4+10];
int n,ans;
void Update(int l,int r,int h,int index)
{
l=max(t[index].l,l);
r=min(t[index].r,r);
if(l>=r)
return;
if(t[index].flag)
{
Update(l,r,h,index<<1);
Update(l,r,h,index<<1|1);
return;
}
if(t[index].h>h)
return;
if(t[index].l<l)
{
t[index<<1].l=t[index].l;
t[index<<1].r=l;
t[index<<1].h=t[index].h;
t[index<<1|1].l=l;
t[index<<1|1].r=t[index].r;
t[index<<1|1].h=t[index].h;
t[index].flag=1;
Update(l,r,h,index);
return;
}
else if(r<t[index].r)
{
t[index<<1].l=t[index].l;
t[index<<1].r=r;
t[index<<1].h=t[index].h;
t[index<<1|1].l=r;
t[index<<1|1].r=t[index].r;
t[index<<1|1].h=t[index].h;
t[index].flag=1;
Update(l,r,h,index);
return;
}
t[index].h=h;
ans+=r-l;
return;
}
int main()
{
int T;
while(scanf("%d",&T)&&T)
{
while(T--)
{
memset(t,0,sizeof(t));
t[1].l=1;
t[1].r=maxn;
ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int ita,itb,itc;
scanf("%d%d%d",&ita,&itb,&itc);
Update(ita,itb,itc,1);
}
printf("%d\n",ans);
}
}
return 0;
}