uva1232

来源:互联网 发布:淘宝卖家货到付款流程 编辑:程序博客网 时间:2024/06/05 22:35
#include<cstdio>#include<algorithm>#include<iostream>#include<sstream>#include<cstring>#include<queue>#include<map>#include<set>#include<stack>#define INF 0x3f3f3f3f#define MAXN 100010#define MAXM 35#define MAXNODE 4*MAXN#define eps 1e-9#define pi 4*atan(1.0)#define pii pair<int,int>using namespace std;int T,N,ql,qr,height,ans,minv[MAXNODE],maxv[MAXNODE],setv[MAXNODE],l[MAXN],r[MAXN],h[MAXN];void maintain(int o,int L,int R){    int lc=(o<<1),rc=(o<<1|1);    if(L<R){        minv[o]=min(minv[lc],minv[rc]);        maxv[o]=max(maxv[lc],maxv[rc]);    }    if(setv[o]!=-1) minv[o]=maxv[o]=setv[o];}void pushdown(int o){    if(setv[o]!=-1){        int lc=(o<<1),rc=(o<<1|1);        setv[lc]=setv[rc]=setv[o];        setv[o]=-1;    }}void update(int o,int L,int R){    if(height<minv[o]) return;    if(ql<=L&&qr>=R){        if(height>=maxv[o]){            setv[o]=maxv[o]=minv[o]=height;            ans+=R-L+1;            return;        }        if(L==R) return;    }    pushdown(o);    int mid=(L+R)/2,lc=(o<<1),rc=(o<<1|1);    if(ql<=mid) update(lc,L,mid);    else maintain(lc,L,mid);    if(qr>mid) update(rc,mid+1,R);    else maintain(rc,mid+1,R);    maintain(o,L,R);}int main(){    freopen("in.txt","r",stdin);    while(scanf("%d",&T)!=EOF,T){        while(T--){            memset(setv,-1,sizeof(setv));            memset(minv,0,sizeof(minv));            memset(maxv,0,sizeof(maxv));            setv[1]=0;            scanf("%d",&N);            int MINL=INF,MAXR=-1;            for(int i=0;i<N;i++){                scanf("%d%d%d",&l[i],&r[i],&h[i]);                MINL=min(MINL,l[i]);                MAXR=max(MAXR,r[i]);            }            ans=0;            for(int i=0;i<N;i++){                ql=l[i]+1;                qr=r[i];                height=h[i];                update(1,MINL,MAXR);            }            printf("%d\n",ans);        }    }    return 0;}

0 0