Advertisement
a53

Intersectie Segmente

a53
Jul 27th, 2017
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. #define NMAX 200010
  4. #define CMAX 300010
  5.  
  6. using namespace std;
  7.  
  8. FILE *fin, *fout;
  9.  
  10. struct segment
  11. {
  12. int x, y1, y2, tip;
  13. };
  14.  
  15. int n, nr, ain[4 * CMAX], sol, ymax, aib[CMAX];
  16. segment A[NMAX];
  17.  
  18. bool crit(segment a, segment b);
  19. void update(int x, int q, int st, int dr, int nod);
  20. int calcul(int a, int b, int st, int dr, int nod);
  21. void update(int x, int q);
  22. int calcul(int x);
  23. int zeros(int x);
  24.  
  25. int main()
  26. {
  27. int i, x1, y1, x2, y2;
  28. fin = fopen("is.in", "r");
  29. fout = fopen("is.out", "w");
  30. fscanf(fin, "%d", &n);
  31. for (i = 1; i <= n; i++)
  32. {
  33. fscanf(fin, "%d%d%d%d", &x1, &y1, &x2, &y2);
  34. if (y1 == y2)
  35. {
  36. A[++nr].x = x1;
  37. A[nr].tip = 1;
  38. A[nr].y1 = y1;
  39. A[++nr].x = x2;
  40. A[nr].tip = -1;
  41. A[nr].y1 = y1;
  42. }
  43. else
  44. {
  45. A[++nr].x = x1;
  46. A[nr].tip = 0;
  47. A[nr].y1 = y1;
  48. A[nr].y2 = y2;
  49. }
  50. if (y2 > ymax)
  51. ymax = y2;
  52. }
  53. sort(A + 1, A + nr + 1, crit);
  54. if (ymax <= 100000)
  55. {
  56. for (i = 1; i <= nr; i++)
  57. {
  58. if (A[i].tip == 0)
  59. sol += calcul(A[i].y1, A[i].y2, 0, 100010, 1);
  60. else
  61. update(A[i].y1, A[i].tip, 0, 100010, 1);
  62. }
  63. }
  64. else
  65. {
  66. for (i = 1; i <= nr; i++)
  67. {
  68. if (A[i].tip == 0)
  69. sol += calcul(A[i].y2) - calcul(A[i].y1 - 1);
  70. else
  71. update(A[i].y1, A[i].tip);
  72. }
  73. }
  74. fprintf(fout, "%d\n", sol);
  75. fclose(fout);
  76. return 0;
  77. }
  78.  
  79. bool crit(segment a, segment b)
  80. {
  81. return a.x < b.x;
  82. }
  83. void update(int x, int q, int st, int dr, int nod)
  84. {
  85. int mij = ((st + dr) >> 1);
  86. ain[nod] += q;
  87. if (st == dr)
  88. return ;
  89. if (x <= mij)
  90. update(x, q, st, mij, nod << 1);
  91. else
  92. update(x, q, mij + 1, dr, (nod << 1) + 1);
  93. }
  94. int calcul(int a, int b, int st, int dr, int nod)
  95. {
  96. int rez = 0, mij = ((st + dr) >> 1);
  97. if (st >= a && dr <= b)
  98. return ain[nod];
  99. if (a <= mij)
  100. rez += calcul(a, b, st, mij, nod << 1);
  101. if (b > mij)
  102. rez += calcul(a, b, mij + 1, dr, (nod << 1) + 1);
  103. return rez;
  104. }
  105. void update(int x, int q)
  106. {
  107. int i;
  108. for (i = x; i <= ymax; i += zeros(i))
  109. aib[i] += q;
  110. }
  111. int calcul(int x)
  112. {
  113. int i, rez = 0;
  114. for (i = x; i > 0; i -= zeros(i))
  115. rez += aib[i];
  116. return rez;
  117. }
  118. int zeros(int x)
  119. {
  120. return (x & (-x));
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement