Advertisement
cincout

Количество точек в прямоугольнике

Jul 15th, 2019
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const int maxn = 6;
  8.  
  9. struct fenwick {
  10. vector <int> t;
  11. int n;
  12. void init(int nn) {
  13. n = nn;
  14. t.assign(n, 0);
  15. }
  16. int sum(int r) {
  17. int result = 0;
  18. for (; r >= 0; r = (r & (r + 1)) - 1)
  19. result += t[r];
  20. return result;
  21. }
  22. void inc(int i, int delta) {
  23. for (; i < n; i = (i | (i + 1)))
  24. t[i] += delta;
  25. }
  26. int sum(int l, int r) {
  27. return sum(r) - sum(l - 1);
  28. }
  29. };
  30.  
  31. struct seg_tree
  32. {
  33. seg_tree *l, *r;
  34. seg_tree() : l(0), r(0) {}
  35. vector <int> mt;
  36. fenwick mem;
  37. };
  38.  
  39. void add(seg_tree * a, int tl, int tr, int pos, int tms)
  40. {
  41. if (tl + 1 == tr)
  42. {
  43. a->mt.push_back(tms);
  44. return;
  45. }
  46. int m = (tl + tr) / 2;
  47. if (pos < m)
  48. {
  49. if (a->l == nullptr)
  50. a->l = new seg_tree();
  51. add(a->l, tl, m, pos, tms);
  52. }
  53. else
  54. {
  55. if (a->r == nullptr)
  56. a->r = new seg_tree();
  57. add(a->r, m, tr, pos, tms);
  58. }
  59. }
  60.  
  61. int get_sz(seg_tree * a)
  62. {
  63. if (a == nullptr)
  64. return 0;
  65. return a->mt.size();
  66. }
  67.  
  68. int get_elem(seg_tree * a, int v)
  69. {
  70. if (a == nullptr)
  71. return INT_MAX;
  72. return a->mt[v];
  73. }
  74.  
  75. void build(seg_tree * a, int l, int r)
  76. {
  77. if (a == nullptr)
  78. return;
  79. if (l + 1 == r)
  80. {
  81. sort(a->mt.begin(), a->mt.end());
  82. a->mem.init(a->mt.size());
  83. return;
  84. }
  85. int m = (l + r) / 2;
  86. build(a->l, l, m);
  87. build(a->r, m, r);
  88. a->mt.resize(get_sz(a->r) + get_sz(a->l));
  89. int ukL = 0, ukR = 0;
  90. for (int &j : a->mt)
  91. {
  92. if (ukL == get_sz(a->l) || (ukR != get_sz(a->r) && get_elem(a->r, ukR) < get_elem(a->l, ukL)))
  93. {
  94. j = get_elem(a->r, ukR++);
  95. }
  96. else
  97. {
  98. j = get_elem(a->l, ukL++);
  99. }
  100. }
  101. a->mem.init((int)a->mt.size() + 1);
  102. }
  103.  
  104. void put(seg_tree *a, int tl, int tr, int pos, int tms)
  105. {
  106. a->mem.inc(lower_bound(a->mt.begin(), a->mt.end(), tms) - (a->mt).begin(), 1);
  107. if (tl + 1 == tr) return;
  108. int m = (tl + tr) / 2;
  109. if (pos < m)
  110. put(a->l, tl, m, pos, tms);
  111. else
  112. put(a->r, m, tr, pos, tms);
  113. }
  114.  
  115. int ele(seg_tree * a, int tl, int tr, int l, int r, int tms)
  116. {
  117. if (a == nullptr)
  118. return 0;
  119. if (l <= tl && tr <= r)
  120. {
  121. return a->mem.sum(lower_bound(a->mt.begin(), a->mt.end(), tms) - (a->mt).begin() - 1);
  122. }
  123. else if (tl >= r || l >= tr)
  124. {
  125. return 0;
  126. }
  127. int m = (tl + tr) / 2;
  128. return ele(a->l, tl, m, l, r, tms) + ele(a->r, m, tr, l, r, tms);
  129. }
  130.  
  131. struct cut
  132. {
  133. int tin = 0;
  134. struct req
  135. {
  136. int ybot, ytop, xleft, xright, num, aTime;
  137. char isPoint;
  138. req(int y1, int y2, int x1, int x2, char t, int pnum, int _time)
  139. {
  140. ybot = y1;
  141. ytop = y2;
  142. xleft = x1;
  143. xright = x2;
  144. isPoint = t;
  145. num = pnum;
  146. aTime = _time;
  147. }
  148. };
  149. vector <req> kek;
  150. vector <int> rofl;
  151. int ftype(req t)
  152. {
  153. if (t.isPoint)
  154. return 2;
  155. if (t.xleft <= t.xright)
  156. return 1;
  157. return 3;
  158. }
  159. int add_rect(int x1, int y1, int x2, int y2)
  160. {
  161. rofl.push_back(0);
  162. kek.push_back({y1, y2, x1, x2, 0, (int) rofl.size() - 1, ++tin});
  163. kek.push_back({y1, y2, x2, x1, 0, (int) rofl.size() - 1, tin});
  164. return (int) rofl.size() - 1;
  165. }
  166. void add_point(int x1, int y1)
  167. {
  168. kek.push_back({y1, y1, x1, x1, 1, -1, ++tin});
  169. }
  170. vector <int> calculated()
  171. {
  172. sort(kek.begin(), kek.end(), [&](const req &a,const req &b) { if (a.xleft != b.xleft) return a.xleft < b.xleft; return ftype(a) < ftype(b); });
  173. seg_tree * vint = new seg_tree();
  174. for (auto t : kek)
  175. {
  176. if (t.isPoint)
  177. {
  178. add(vint, -maxn, maxn, t.ybot, t.aTime);
  179. }
  180. }
  181. build(vint, -maxn + 1, maxn);
  182. for (auto i : kek)
  183. {
  184. if (ftype(i) == 1)
  185. {
  186. rofl[i.num] -= ele(vint, -maxn, maxn, i.ybot, i.ytop + 1, i.aTime);
  187. }
  188. else if (ftype(i) == 3)
  189. {
  190. rofl[i.num] += ele(vint, -maxn, maxn, i.ybot, i.ytop + 1, i.aTime);
  191. }
  192. else
  193. {
  194. put(vint, -maxn, maxn, i.ytop, i.aTime);
  195. }
  196. }
  197. return rofl;
  198. }
  199. };
  200.  
  201. pair<int, int> rev(int x, int y)
  202. {
  203. return {y, -x};
  204. }
  205.  
  206. int main()
  207. {
  208. ios::sync_with_stdio(0);
  209. cin.tie(0);
  210.  
  211.  
  212. return 0;
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement