prestige

Untitled

Jan 10th, 2013
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <queue>
  4. #include <list>
  5. #include <vector>
  6. #include <algorithm>
  7. using namespace std;
  8. //using std::priority_queue;
  9. //using std::set;
  10. //using std::list;
  11. //using std::pair;
  12. int algo = 0;
  13. int gl_time = 0;
  14. //struct Proc{
  15. // List * prev;
  16. // List * next;
  17. // int begin, end_time, size;
  18. // Proc() {}
  19. // Proc(List * prev, List * next, int begin, int end_time, int size)
  20. // : prev(prev), next(next), begin(begin), end_time(end_time), size(size) {}
  21. //};
  22. class Set {
  23. public:
  24. int size_, begin_;
  25. List * it_;
  26. Set() {}
  27. //Set(int size, int begin) : size_(size), begin_(begin), it_(NULL) {}
  28. Set(int size, int begin, List * it = NULL) : size_(size), begin_(begin), it_(it) {}
  29. bool operator< (const Set & a) {
  30. if (this->size_ < a.size_)
  31. return true;
  32. else if (this->size_ == a.size_) {
  33. return this->begin_ < a.begin_;
  34. } else
  35. return false;
  36. }
  37. };
  38. class Queue {
  39. public:
  40. int end_time_;
  41. List * it_;
  42. Queue() {}
  43. Queue(int end_time, List * it) : end_time_(end_time), it_(it) {}
  44. bool operator< (const Queue & a) {
  45. return this->end_time_ < a.end_time_;
  46. }
  47. };
  48. class List {
  49. public:
  50. List * prev;
  51. List * next;
  52. int begin, end_time, size;
  53. set<Set>::iterator it_;
  54. List() {}
  55. List(List * prev, List * next, int begin, int end_time, int size, set<Set>::iterator it)
  56. : prev(prev), next(next), begin(begin), end_time(end_time), size(size), it_(it) {}
  57. };
  58. set<Set> fr_segment;
  59. priority_queue<Queue> bs_segment;
  60. list<List> ram;
  61. void initialize(int n) {
  62. //free segment with end_time = - 1
  63. ram.push_back(List(NULL, NULL, 0, -1, n, fr_segment.end()));
  64. }
  65. void insert(pair<int, int> a) { //size, time
  66. set<Set>::iterator p = fr_segment.lower_bound(Set(a.first, 0));
  67. if (p != fr_segment.end()) {
  68. // жду пока освоболиться достаточно памяти
  69. //removing busy segment form structures
  70. gl_time = bs_segment.top().end_time_;
  71. List * p = bs_segment.top().it_;
  72. //may try to reduce number of if's?
  73. //partly intersection of if's
  74. //must be deleting and new inserting into set
  75. if (p->prev == NULL && p->next == NULL) {
  76. p->end_time = -1;
  77. fr_segment.insert(Set(p->size, p->begin));
  78. } else if (p->next == NULL) {
  79. if (p->prev->end_time != -1) {
  80. p->end_time = -1;
  81. fr_segment.insert(Set(p->size, p->begin, p));
  82. } else {
  83. fr_segment.erase(p->it_);
  84. fr_segment.erase(p->prev->it_);
  85. p->prev->end_time = -1;
  86. p->prev->size += p->size;
  87. p->prev->next = NULL;
  88. fr_segment.insert(Set(p->prev->size, p->prev->begin, p->prev));
  89. }
  90. } else if (p->prev == NULL) {
  91. if (p->next->end_time != -1) {
  92. p->end_time = -1;
  93. fr_segment.insert(Set(p->size, p->begin, p));
  94. } else {
  95. fr_segment.erase(p->next->it_);
  96. p->next->size += p->size;
  97. p->next->prev = NULL;
  98. fr_segment.insert(Set(p->next->size, p->begin, p->next));
  99. }
  100. } else {
  101. if (p->prev->end_time == -1 && p->next->end_time == -1) {
  102. fr_segment.erase(p->it_);
  103. fr_segment.erase(p->next->it_);
  104. fr_segment.erase(p->it_);
  105. p->prev->size += p->size + p->next->size;
  106. if (p->next->next != NULL) {
  107. p->prev->next = p->next->next;
  108. p->next->next->prev = p->prev;
  109. } else
  110. p->prev->next = NULL;
  111. fr_segment.insert(Set(p->prev->size, p->prev->begin, p->prev));
  112. } else if(p->prev->end_time == -1 && p->next->end_time != -1) {
  113. fr_segment.erase(p->prev->it_);
  114. p->prev->size += p->size;
  115. p->prev->next = p->next;
  116. p->next->prev = p->prev;
  117. fr_segment.insert(Set(p->prev->size, p->prev->begin, p->prev));
  118. } else if(p->prev->end_time != -1 && p->next->end_time == -1) {
  119. fr_segment.erase(p->next->it_);
  120. p->next->prev = p->prev;
  121. p->next->size += p->size;
  122. p->next->begin = p->begin;
  123. p->prev->next = p->next;
  124. }
  125. }
  126. bs_segment.pop();
  127. insert(a);
  128. return ;
  129. } else {
  130. // insert busy segment into list
  131. if (ram.empty()) {
  132. List * temp = new List(NULL, NULL, 0, a.second + gl_time, a.first, fr_segment.begin());
  133. ram.push_back(*temp);
  134. fr_segment.insert(Set(a.first, p->begin_, ram.begin()));
  135. bs_segment(a.second + gl_time,);
  136. } else if (p->it_->prev == NULL) {
  137. fr_segment.erase(p);
  138.  
  139. } else {
  140. ((p->it_))->size -= a.first;
  141. ((p->it_))->begin += a.first;
  142. (((p->it_))->prev)->next =
  143. Proc((((p->it_))->prev), ((p->it_)), (p->it_)->begin, a.second + gl_time, a.first);
  144. (((p->it_))->prev) = (((p->it_))->prev)->next;
  145. }
  146. //magic with priority_queue
  147. bs_segment.push(Queue(gl_time + a.second, (p->it_)->prev));
  148. gl_time = bs_segment.top().end_time_;
  149. // insert into set of fr_segment
  150. insert(a);
  151. return ;
  152. }
  153. }
  154. int main() {
  155. return 0;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment