pku 2528

来源:互联网 发布:自动开关机的软件 编辑:程序博客网 时间:2024/05/20 18:46
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <set>#include <string>#include <cstring>#include <list>#include <queue>#include <stack>#include <cmath>using namespace std;#define PF(x) (scanf("%d",&x))#define PT(x,y) (scanf("%d%d",&x,&y))#define PR(x) (printf("%d\n",x))#define PRT(x,y)(printf("%d %d\n",x,y))#define PB(x)(scanf("%I64d",&x))#define PRB(x)(printf("%I64d\n",(x)))typedef __int64 LL;#define N 20005#define M 105#define Mod 1000#define Inf 0x7fffffff#define L(x) (x<<1)#define R(x) ((x<<1)|1)#define For(i,n) for(int i=0;i<(n);i++)#define lowbit(x) (x) & (-x)#define mid(x,y) ((x+y)>>1)struct tree{int l,r;int flag;};int ar[N];struct range{int l,r;void in(int id){PT(l,r);ar[id*2]=l;ar[id*2+1] = r;}};range arr[N];tree T[4*N];int n;map<int ,int> G;inline int maxx(int a,int b){return a>b?a:b;}inline int minx(int a,int b){return a>b?b:a;}void build(int l,int r,int k){    T[k].l = l;T[k].r = r;T[k].flag = 0;if(l == r) return ;int mi = mid(l,r);build(l,mi,L(k));build(mi+1,r,R(k));}int update(int l,int r,int k){if(l<=T[k].l && r>=T[k].r){if(T[k].flag ) return 0;else {T[k].flag = 1;return 1;}}if(T[k].flag) return 0;int mi = mid(T[k].l ,T[k].r);int ans = 0;if(l<=mi) ans = maxx(ans,update(l,r,L(k)));if(r>mi) ans = maxx(ans,update(l,r,R(k)));if(T[L(k)].flag && T[R(k)].flag) T[k].flag = 1;return ans;}int rsearch(int s,int t,int var){int mi;while(s<=t){mi = mid(s,t);if(ar[mi] == var) return mi;if(ar[mi]<var) s = mi+1;else t = mi-1;}return mi;}void init(){int test;PF(test);For(i,test){PF(n);For(j,n)arr[j].in(j);sort(ar,ar+2*n);int tos = 0;For(j,2*n){if(j==0) ar[tos++] = ar[j];else if(ar[j]!=ar[j-1]) ar[tos++] = ar[j];}build(1,tos,1);int ans = 0;for(int j=n-1;j>=0;j--){ans +=update(rsearch(0,tos-1,arr[j].l)+1,rsearch(0,tos-1,arr[j].r)+1,1);}PR(ans);}   return ;}int main(){init();return 0;}