prestige

Untitled

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