//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; }