main.cc 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int N = 10000;
  6. const int L = 10000000;
  7. int id[2 * N];
  8. int hash[L + 1];
  9. struct Post {
  10. int l;
  11. int r;
  12. };
  13. Post poster[N];
  14. struct TNode {
  15. bool val;
  16. int beg;
  17. int end;
  18. TNode *l;
  19. TNode *r;
  20. int mid() { return beg + (end - beg) / 2; }
  21. };
  22. TNode tree[8 * N]; // May be 2 * len(id) of intervals, so 2 * 2 * len(id)
  23. int tid;
  24. TNode *build_tree(TNode *root, int beg, int end) {
  25. root->beg = beg;
  26. root->end = end;
  27. root->val = false;
  28. if (beg != end) {
  29. root->l = build_tree(&tree[tid++], beg, root->mid());
  30. root->r = build_tree(&tree[tid++], root->mid() + 1, end);
  31. }
  32. return root;
  33. }
  34. bool query(TNode *root, int beg, int end) {
  35. if (root->val) return false;
  36. if (root->beg == beg && root->end == end) {
  37. return root->val = true;
  38. return true;
  39. }
  40. bool res;
  41. if (root->mid() < beg) {
  42. res = query(root->r, beg, end);
  43. } else if (end <= root->mid()) {
  44. res = query(root->l, beg, end);
  45. } else {
  46. // Do NOT use the short cut operator!
  47. bool b1 = query(root->l, beg, root->mid());
  48. bool b2 = query(root->r, root->mid() + 1, end);
  49. res = b1 || b2;
  50. }
  51. if (root->l->val && root->r->val) root->val = true;
  52. return res;
  53. }
  54. int main() {
  55. int c, n;
  56. scanf("%d", &c);
  57. while (c--) {
  58. scanf("%d", &n);
  59. int k = 0;
  60. for (int i = 0; i < n; i++) {
  61. scanf("%d %d", &poster[i].l, &poster[i].r);
  62. id[k++] = poster[i].l;
  63. id[k++] = poster[i].r;
  64. }
  65. sort(id, id + k);
  66. k = unique(id, id + k) - id;
  67. int intervals = 0;
  68. for (int i = 0; i < k; i++) {
  69. hash[id[i]] = intervals;
  70. if (i < k - 1) {
  71. if (id[i] + 1 == id[i + 1])
  72. intervals++;
  73. else // !!Really important
  74. intervals += 2;
  75. }
  76. }
  77. tid = 0;
  78. TNode *root = &tree[tid++];
  79. build_tree(root, 0, intervals);
  80. int cnt = 0;
  81. for (int i = n - 1; 0 <= i; i--)
  82. if (query(root, hash[poster[i].l], hash[poster[i].r])) cnt++;
  83. printf("%d\n", cnt);
  84. }
  85. return 0;
  86. }