Advertisement
promitheus_sal

frogsandmosquitos.cpp

Jan 24th, 2023
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.98 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <utility>
  5. #include <algorithm>
  6. #include <set>
  7.  
  8. constexpr int MAXN = 200500;
  9. constexpr int MAXM = 200500;
  10. constexpr int MAXP = 1000000000;
  11.  
  12. int N; //num of frogs
  13. int M; //num of mosqs
  14.  
  15. struct Frog {
  16. int pos;
  17. int id;
  18. int size;
  19. };
  20.  
  21. struct Mosquito {
  22. int pos;
  23. int size;
  24. };
  25.  
  26. Frog FROGS[MAXN];
  27. Mosquito MOSQUITOS[MAXM];
  28.  
  29. int URANGEB;
  30. int URANGEE;
  31.  
  32. class Node {
  33. public:
  34. Node* left;
  35. Node* right;
  36. int leftest;
  37. int rightest;
  38.  
  39. Node(Node* left, Node* right, int leftest, int rightest) : left{ left }, right{ right }, leftest{ leftest }, rightest{ rightest }{};
  40.  
  41. static Node* Build(int l, int r) {
  42. if (l == r)
  43. return new Node(nullptr, nullptr, FROGS[l].pos, FROGS[l].pos + FROGS[l].size);
  44. int mid = (l + r) >> 1;
  45. Node* a = Build(l, mid);
  46. Node* b = Build(mid + 1, r);
  47. return new Node(a, b, a->leftest, std::max(a->rightest, b->rightest));
  48. }
  49.  
  50. bool TryFeedMosquito(Mosquito m, int l, int r) {
  51. int mid = (l + r) >> 1;
  52. if (l==r)
  53. {
  54. if (leftest > m.pos || rightest < m.pos)
  55. return false;
  56. URANGEB = rightest;
  57. rightest += m.size;
  58. FROGS[l].size += m.size;
  59. URANGEE = rightest;
  60. return true;
  61. }
  62. if (m.pos <= left->rightest)
  63. {
  64. return left->TryFeedMosquito(m, l, mid);
  65. }
  66. else if (m.pos >= right->leftest)
  67. {
  68. return right->TryFeedMosquito(m, mid + 1, r);
  69. }
  70. else
  71. return false;
  72. }
  73. };
  74.  
  75. int SIZE[MAXN];
  76. int COUNT[MAXN];
  77.  
  78. std::set<Mosquito> MSET;
  79.  
  80. Node* root;
  81.  
  82. int main() {
  83. scanf("%d%d", &N, &M);
  84. for (int i = 0; i < N; i++)
  85. {
  86. scanf("%d%d", &FROGS[i].pos, &FROGS[i].size);
  87. FROGS[i].id = i + 1;
  88. }
  89. for (int i = 0; i < M; i++) {
  90. scanf("%d%d", &MOSQUITOS[i].pos, &MOSQUITOS[i].size);
  91. }
  92. std::sort(FROGS, FROGS + N, [](const Frog& a, const Frog& b) {return a.pos < b.pos; });
  93. root = Node::Build(0, N - 1);
  94. for (int m = 0; m < M; m++) {
  95. bool b = root->TryFeedMosquito(MOSQUITOS[m], 0, N - 1);
  96. }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement