//9368182 NKHelloWorld 2528 Accepted 1180K 79MS C++ 2792B 2011-09-27 22:07:26
//9368188 NKHelloWorld 2528 Accepted 1712K 63MS G++ 2792B 2011-09-27 22:08:48
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct STNODE//线段树中的节点
{
    int left,right,color;
}stree[55000];
struct POINT//离散化专用
{
    int point,num;
    bool operator< (const POINT &other)const
    {
        return point < other.point;
    }
}point[22000];
struct SEGMENT
{
    int left,right;
}segment[11000];

int n,ans;
bool visit[22000];
void buildST(int pos,int l,int r)//建树
{
    stree[pos].left = l;    stree[pos].right = r;   stree[pos].color = 0;
    if(l!=r)
    {
        buildST(pos+pos,l,(l+r)>>1);
        buildST(pos+pos+1,(l+r)/2+1,r);
    }
}
void insertST(int pos,int l,int r,int color)
{
    int mid;
    if(stree[pos].left == l && stree[pos].right ==r)
    {
        stree[pos].color = color;   return ;
    }
    if(stree[pos].color > 0 &&stree[pos].color != color)
    {
        stree[pos+pos].color = stree[pos].color;    stree[pos+pos+1].color = stree[pos].color;  stree[pos].color = 0;
    }
    mid = (stree[pos].left + stree[pos].right)>>1;
    if(mid >= r)
    {
        insertST(pos+pos,l,r,color);
    }
    else if(mid < l)
    {
        insertST(pos+pos+1,l,r,color);
    }
    else
    {
        insertST(pos+pos,l,mid,color);
        insertST(pos+pos+1,mid+1,r,color);
    }
}

void getAns(int pos)
{
    if(stree[pos].color!=0)
    {
        if(!visit[stree[pos].color])
        {
            visit[stree[pos].color] = true; ans++;
        }
        return ;
    }
    getAns(pos+pos);
    getAns(pos+pos+1);
}

int main()
{
    int i,j,k,a,b,totcase;
    scanf("%d",&totcase);
    while(totcase --)
    {
        scanf("%d",&n);
        //input and Li San Hua
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&segment[i].left,&segment[i].right);
            if(segment[i].left > segment[i].right)  swap(segment[i].left,segment[i].right);
            point[i+i-2].point = segment[i].left;   point[i+i-2].num = -i;
            point[i+i-1].point = segment[i].right;  point[i+i-1].num = i;
        }
        sort(point,point+n+n);
        int _cnt = 1,_last = point[0].point;
        for(i=0;i<n+n;i++)
        {
            if(point[i].point!=_last)
            {
                _cnt++;
                _last = point[i].point;
            }
            if(point[i].num < 0)
                segment[-point[i].num].left = _cnt;
            else
                segment[point[i].num].right = _cnt;
        }
        //Li San Hua finish
        buildST(1,1,_cnt);
        ans = 0;
        memset(visit,0,sizeof(visit));
        for(i=1;i<=n;i++)
        {
            insertST(1,segment[i].left,segment[i].right,i);
        }
        getAns(1);
        printf("%d\n",ans);
    }
    return 0;
}

posted on 2011-09-27 22:51  NKHe!!oWor!d  阅读(172)  评论(0编辑  收藏  举报