Advertisement
farsid

Untitled

Aug 8th, 2012
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. #define filer() freopen("in.txt","r",stdin)
  2. #define filew() freopen("out.txt","w",stdout)
  3. #define SET(a, x) memset((a), (x), sizeof(a))
  4. #define i64 long long
  5. #include<iostream>
  6. #include<stdio.h>
  7. #include<string.h>
  8. #include<math.h>
  9. #include<algorithm>
  10. #include<queue>
  11. #include<stack>
  12. #include<vector>
  13. #include <map>
  14. #define INF 1<<29
  15.  
  16. using namespace std;
  17.  
  18. int vst[10000010];
  19.  
  20. vector<int>P;
  21.  
  22. struct NODE
  23. {
  24. int l,r,order;
  25. };
  26.  
  27. int M[1048576];
  28.  
  29. int LZY[1048576];
  30.  
  31. int TRUE;
  32.  
  33. priority_queue<NODE>PQ;
  34.  
  35. bool operator<(NODE a ,NODE b)
  36. {
  37. return a.order<b.order;
  38. }
  39.  
  40. bool query(int b,int e,int lft,int rite,int i)
  41. {
  42. if(LZY[i]==1)
  43. {
  44.  
  45. M[i]=rite-lft+1;
  46. }
  47.  
  48. if(lft>e || rite<b)return 0;
  49.  
  50.  
  51. if(lft>=b && rite<=e)
  52. {
  53. if(M[i]==(rite-lft+1))return 0;
  54. return 1;
  55. }
  56. if(LZY[i]==1){LZY[i]=1;LZY[2*i]=1;LZY[2*i+1]=1;}
  57. bool x=query(b,e,lft,(lft+rite)/2,2*i);
  58. bool y=query(b,e,(lft+rite)/2+1,rite,2*i+1);
  59.  
  60. return (x || y);
  61. }
  62.  
  63. void update(int b,int e,int lft,int rite,int i)
  64. {
  65. if(lft>e || rite<b)return ;
  66.  
  67. if(lft>=b && rite<=e)
  68. {
  69. M[i]=rite-lft+1;
  70. LZY[i]=1;
  71. return ;
  72. }
  73.  
  74. update(b,e,lft,(lft+rite)/2,2*i);
  75. update(b,e,(lft+rite)/2+1,rite,2*i+1);
  76.  
  77. M[i]=M[2*i]+M[2*i+1];
  78.  
  79. }
  80.  
  81. int search(int x,int sz)
  82. {
  83. int lo,hi,mid;
  84.  
  85. lo=0;hi=sz-1;
  86. while(lo<=hi)
  87. {
  88. mid=(lo+hi)/2;
  89.  
  90. if(P[mid]==x)return mid;
  91. else if(P[mid]<x)lo=mid+1;
  92. else hi=mid-1;
  93. }
  94. }
  95.  
  96. int main()
  97. {
  98. //filer();
  99. int T,cas=0,n,i,cov,ans;
  100. NODE S;
  101. scanf("%d",&T);
  102. while(T--)
  103. {
  104. TRUE++;
  105. ans=0;
  106.  
  107. scanf("%d",&n);
  108. for(i=0;i<n;i++)
  109. {
  110. scanf("%d%d",&S.l,&S.r);
  111. S.order=i;
  112. if(vst[S.l]!=TRUE){P.push_back(S.l);vst[S.l]=TRUE;}
  113. if(vst[S.r]!=TRUE){P.push_back(S.r);vst[S.r]=TRUE;}
  114. PQ.push(S);
  115. }
  116. sort(P.begin(),P.end());
  117. while(!PQ.empty())
  118. {
  119. S=PQ.top();
  120. PQ.pop();
  121.  
  122. int sz=P.size();
  123. int x=search(S.l,sz);
  124. int y=search(S.r,sz);
  125.  
  126. if(query(x,y,0,sz-1,1))
  127. {
  128. ans++;
  129. update(x,y,0,sz-1,1);
  130. }
  131. }
  132. printf("%d\n",ans);
  133. if(T){SET(M,0);SET(LZY,0);}
  134. }
  135. return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement