#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn = 1e5 + 10;
int h[maxn<<2];//the height of the interval
int lazy[maxn<<2];//the max_height of the interval
int update(int L,int R,int v,int l,int r,int rt)
{
if(L<=l&&r<=R)//if we occupy the interval
{
if(h[rt]>v) return 0;//if v<h[rt] we can update nothing
h[rt]=max(h[rt],v);//we update h[rt]
if(v>=lazy[rt])//if v >= the max_height of the interval
{
lazy[rt]=v;
//printf("%d %d %d %d\n",l,r,v,h[rt]);
return r-l+1;
}
else if(l<r)
{
h[rt<<1]=max(h[rt<<1],h[rt]);
h[rt<<1|1]=max(h[rt<<1|1],h[rt]);
lazy[rt<<1]=max(lazy[rt<<1],h[rt<<1]);
lazy[rt<<1|1]=max(lazy[rt<<1|1],h[rt<<1|1]);
int m=(l+r)>>1;
return update(L,R,v,lson)+update(L,R,v,rson);
}
else return 0;
}
lazy[rt]=max(lazy[rt],v);
h[rt<<1]=max(h[rt<<1],h[rt]);
h[rt<<1|1]=max(h[rt<<1|1],h[rt]);
lazy[rt<<1]=max(lazy[rt<<1],h[rt<<1]);
lazy[rt<<1|1]=max(lazy[rt<<1|1],h[rt<<1|1]);
int m=(l+r)>>1;
if(R<=m) return update(L,R,v,lson);
if(L>m) return update(L,R,v,rson);
return update(L,R,v,lson)+update(L,R,v,rson);
}
int main()
{
int T;
while(scanf("%d",&T)!=EOF&&T)
{
while(T--)
{
memset(h,-1,sizeof(h));
memset(lazy,-1,sizeof(lazy));
int n;
int l,r,v;
scanf("%d",&n);
int ans=0;
int bound=1e5-1;
while(n--)
{
scanf("%d%d%d",&l,&r,&v);
ans+=update(l,r-1,v,1,bound,1);
//printf("%d\n",ans);
}
printf("%d\n",ans);
}
}
return 0;
}
Uva 1232 SKYLINE
最新推荐文章于 2018-06-30 11:02:48 发布