Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define filer() freopen("in.txt","r",stdin)
- #define filew() freopen("out.txt","w",stdout)
- #define SET(a, x) memset((a), (x), sizeof(a))
- #define i64 long long
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #include<algorithm>
- #include<queue>
- #include<stack>
- #include<vector>
- #include <map>
- #define INF 1<<29
- using namespace std;
- int vst[10000010];
- vector<int>P;
- struct NODE
- {
- int l,r,order;
- };
- int M[1048576];
- int LZY[1048576];
- int TRUE;
- priority_queue<NODE>PQ;
- bool operator<(NODE a ,NODE b)
- {
- return a.order<b.order;
- }
- bool query(int b,int e,int lft,int rite,int i)
- {
- if(LZY[i]==1)
- {
- M[i]=rite-lft+1;
- }
- if(lft>e || rite<b)return 0;
- if(lft>=b && rite<=e)
- {
- if(M[i]==(rite-lft+1))return 0;
- return 1;
- }
- if(LZY[i]==1){LZY[i]=1;LZY[2*i]=1;LZY[2*i+1]=1;}
- bool x=query(b,e,lft,(lft+rite)/2,2*i);
- bool y=query(b,e,(lft+rite)/2+1,rite,2*i+1);
- return (x || y);
- }
- void update(int b,int e,int lft,int rite,int i)
- {
- if(lft>e || rite<b)return ;
- if(lft>=b && rite<=e)
- {
- M[i]=rite-lft+1;
- LZY[i]=1;
- return ;
- }
- update(b,e,lft,(lft+rite)/2,2*i);
- update(b,e,(lft+rite)/2+1,rite,2*i+1);
- M[i]=M[2*i]+M[2*i+1];
- }
- int search(int x,int sz)
- {
- int lo,hi,mid;
- lo=0;hi=sz-1;
- while(lo<=hi)
- {
- mid=(lo+hi)/2;
- if(P[mid]==x)return mid;
- else if(P[mid]<x)lo=mid+1;
- else hi=mid-1;
- }
- }
- int main()
- {
- //filer();
- int T,cas=0,n,i,cov,ans;
- NODE S;
- scanf("%d",&T);
- while(T--)
- {
- TRUE++;
- ans=0;
- scanf("%d",&n);
- for(i=0;i<n;i++)
- {
- scanf("%d%d",&S.l,&S.r);
- S.order=i;
- if(vst[S.l]!=TRUE){P.push_back(S.l);vst[S.l]=TRUE;}
- if(vst[S.r]!=TRUE){P.push_back(S.r);vst[S.r]=TRUE;}
- PQ.push(S);
- }
- sort(P.begin(),P.end());
- while(!PQ.empty())
- {
- S=PQ.top();
- PQ.pop();
- int sz=P.size();
- int x=search(S.l,sz);
- int y=search(S.r,sz);
- if(query(x,y,0,sz-1,1))
- {
- ans++;
- update(x,y,0,sz-1,1);
- }
- }
- printf("%d\n",ans);
- if(T){SET(M,0);SET(LZY,0);}
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement