Advertisement
Guest User

Untitled

a guest
Apr 25th, 2023
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. struct DataCenter {
  7. long long id;
  8. long long countAliveServers;
  9. long long countRestarts;
  10. bool *servers;
  11. DataCenter() = default;
  12. DataCenter(long long id, long long m){
  13. this->id = id;
  14. this->countAliveServers = m;
  15. this->countRestarts = 0;
  16. this->servers = new bool[m];
  17. memset(servers, false, m);
  18. }
  19. bool operator==(const DataCenter &dc) const{
  20. return this->id == dc.id;
  21. }
  22. };
  23.  
  24. struct Node{
  25. DataCenter dataCenter;
  26. Node *left;
  27. Node *right;
  28. Node *parent;
  29. bool color; //false - black, true - red
  30. };
  31.  
  32. typedef Node *NodePtr;
  33.  
  34. class RedBlackTree {
  35. private:
  36. NodePtr root;
  37. NodePtr TNULL;
  38.  
  39. static unsigned long long multiply(DataCenter &dataCenter){
  40. return dataCenter.countAliveServers * dataCenter.countRestarts;
  41. }
  42.  
  43. static bool compare(DataCenter &dc1, DataCenter &dc2) {
  44. if (dc1.countAliveServers * dc1.countRestarts < dc2.countAliveServers * dc2.countRestarts) {
  45. return true;
  46. } else if (dc1.countAliveServers * dc1.countRestarts > dc2.countAliveServers * dc2.countRestarts) {
  47. return false;
  48. } else {
  49. return dc1.id < dc2.id;
  50. }
  51. }
  52.  
  53. void rbTransplant(NodePtr u, NodePtr v) {
  54. if (u->parent == nullptr) {
  55. root = v;
  56. } else if (u == u->parent->left) {
  57. u->parent->left = v;
  58. } else {
  59. u->parent->right = v;
  60. }
  61. v->parent = u->parent;
  62. }
  63.  
  64. void deleteNodeHelper(NodePtr node, DataCenter &key) {
  65. NodePtr z = TNULL;
  66. NodePtr x, y;
  67. while (node != TNULL) {
  68. if (node->dataCenter == key) {
  69. z = node;
  70. }
  71.  
  72. if (compare(node->dataCenter, key)) {
  73. node = node->right;
  74. } else {
  75. node = node->left;
  76. }
  77. }
  78.  
  79. if (z == TNULL) {
  80. cout << "Key not found in the tree" << endl;
  81. return;
  82. }
  83.  
  84. y = z;
  85. int y_original_color = y->color;
  86. if (z->left == TNULL) {
  87. x = z->right;
  88. rbTransplant(z, z->right);
  89. } else if (z->right == TNULL) {
  90. x = z->left;
  91. rbTransplant(z, z->left);
  92. } else {
  93. y = minimum(z->right);
  94. y_original_color = y->color;
  95. x = y->right;
  96. if (y->parent == z) {
  97. x->parent = y;
  98. } else {
  99. rbTransplant(y, y->right);
  100. y->right = z->right;
  101. y->right->parent = y;
  102. }
  103.  
  104. rbTransplant(z, y);
  105. y->left = z->left;
  106. y->left->parent = y;
  107. y->color = z->color;
  108. }
  109. delete z;
  110. if (y_original_color == 0) {
  111. deleteFix(x);
  112. }
  113. }
  114.  
  115. void leftRotate(NodePtr x) {
  116. NodePtr y = x->right;
  117. x->right = y->left;
  118. if (y->left != TNULL) {
  119. y->left->parent = x;
  120. }
  121. y->parent = x->parent;
  122. if (x->parent == nullptr) {
  123. this->root = y;
  124. } else if (x == x->parent->left) {
  125. x->parent->left = y;
  126. } else {
  127. x->parent->right = y;
  128. }
  129. y->left = x;
  130. x->parent = y;
  131. }
  132.  
  133. void rightRotate(NodePtr x) {
  134. NodePtr y = x->left;
  135. x->left = y->right;
  136. if (y->right != TNULL) {
  137. y->right->parent = x;
  138. }
  139. y->parent = x->parent;
  140. if (x->parent == nullptr) {
  141. this->root = y;
  142. } else if (x == x->parent->right) {
  143. x->parent->right = y;
  144. } else {
  145. x->parent->left = y;
  146. }
  147. y->right = x;
  148. x->parent = y;
  149. }
  150.  
  151. void deleteFix(NodePtr x) {
  152. NodePtr s;
  153. while (x != root && !x->color) {
  154. if (x == x->parent->left) {
  155. s = x->parent->right;
  156. if (s->color) {
  157. s->color = false;
  158. x->parent->color = true;
  159. leftRotate(x->parent);
  160. s = x->parent->right;
  161. }
  162. if (!s->left->color && !s->right->color) {
  163. s->color = true;
  164. x = x->parent;
  165. } else {
  166. if (!s->right->color) {
  167. s->left->color = false;
  168. s->color = true;
  169. rightRotate(s);
  170. s = x->parent->right;
  171. }
  172. s->color = x->parent->color;
  173. x->parent->color = false;
  174. s->right->color = false;
  175. leftRotate(x->parent);
  176. x = root;
  177. }
  178. } else {
  179. s = x->parent->left;
  180. if (s->color) {
  181. s->color = false;
  182. x->parent->color = true;
  183. rightRotate(x->parent);
  184. s = x->parent->left;
  185. }
  186. if (!s->right->color && !s->left->color) {
  187. s->color = true;
  188. x = x->parent;
  189. } else {
  190. if (!s->left->color) {
  191. s->right->color = false;
  192. s->color = true;
  193. leftRotate(s);
  194. s = x->parent->left;
  195. }
  196. s->color = x->parent->color;
  197. x->parent->color = false;
  198. s->left->color = false;
  199. rightRotate(x->parent);
  200. x = root;
  201. }
  202. }
  203. }
  204. x->color = false;
  205. }
  206.  
  207. void insertFix(NodePtr k) {
  208. NodePtr u;
  209. while (k->parent->color) {
  210. if (k->parent == k->parent->parent->right) {
  211. u = k->parent->parent->left;
  212. if (u->color) {
  213. u->color = false;
  214. k->parent->color = false;
  215. k->parent->parent->color = true;
  216. k = k->parent->parent;
  217. } else {
  218. if (k == k->parent->left) {
  219. k = k->parent;
  220. rightRotate(k);
  221. }
  222. k->parent->color = false;
  223. k->parent->parent->color = true;
  224. leftRotate(k->parent->parent);
  225. }
  226. } else {
  227. u = k->parent->parent->right;
  228.  
  229. if (u->color) {
  230. u->color = false;
  231. k->parent->color = false;
  232. k->parent->parent->color = true;
  233. k = k->parent->parent;
  234. } else {
  235. if (k == k->parent->right) {
  236. k = k->parent;
  237. leftRotate(k);
  238. }
  239. k->parent->color = false;
  240. k->parent->parent->color = true;
  241. rightRotate(k->parent->parent);
  242. }
  243. }
  244. if (k == root) {
  245. break;
  246. }
  247. }
  248. root->color = false;
  249. }
  250.  
  251. NodePtr minimum(NodePtr node) {
  252. while (node->left != TNULL) {
  253. node = node->left;
  254. }
  255. return node;
  256. }
  257.  
  258. NodePtr maximum(NodePtr node) {
  259. while (node->right != TNULL) {
  260. node = node->right;
  261. }
  262. return node;
  263. }
  264.  
  265. void printHelper(NodePtr root, string indent, bool last) {
  266. if (root != TNULL) {
  267. cout << indent;
  268. if (last) {
  269. cout << "R----";
  270. indent += " ";
  271. } else {
  272. cout << "L----";
  273. indent += "| ";
  274. }
  275.  
  276. string sColor = root->color ? "RED" : "BLACK";
  277. cout << "{id: " << root->dataCenter.id << " ,countAliveServers: "
  278. << root->dataCenter.countAliveServers << " ,countRestarts: "
  279. << root->dataCenter.countRestarts << " } "
  280. << "(" << sColor << ")" << endl;
  281. printHelper(root->left, indent, false);
  282. printHelper(root->right, indent, true);
  283. }
  284. }
  285.  
  286. public:
  287. RedBlackTree() {
  288. TNULL = new Node;
  289. TNULL->color = false;
  290. TNULL->left = nullptr;
  291. TNULL->right = nullptr;
  292. root = TNULL;
  293. }
  294.  
  295. void insert(DataCenter key) {
  296. NodePtr node = new Node;
  297. node->parent = nullptr;
  298. node->dataCenter = key;
  299. node->left = TNULL;
  300. node->right = TNULL;
  301. node->color = true;
  302.  
  303. NodePtr y = nullptr;
  304. NodePtr x = this->root;
  305.  
  306. while (x != TNULL) {
  307. y = x;
  308. if (compare(node->dataCenter, x->dataCenter)) {
  309. x = x->left;
  310. } else {
  311. x = x->right;
  312. }
  313. }
  314.  
  315. node->parent = y;
  316. if (y == nullptr) {
  317. root = node;
  318. } else if (compare(node->dataCenter, y->dataCenter)) {
  319. y->left = node;
  320. } else {
  321. y->right = node;
  322. }
  323.  
  324. if (node->parent == nullptr) {
  325. node->color = false;
  326. return;
  327. }
  328.  
  329. if (node->parent->parent == nullptr) {
  330. return;
  331. }
  332.  
  333. insertFix(node);
  334. }
  335.  
  336. void remove(DataCenter data) {
  337. deleteNodeHelper(this->root, data);
  338. }
  339.  
  340. long long getMinId() {
  341. DataCenter dc1 = minimum(root)->dataCenter;
  342. DataCenter dc2 = maximum(root)->dataCenter;
  343. if(multiply(dc1) == multiply(dc2)){
  344. return min(dc1.id, dc2.id);
  345. }
  346. return dc1.id;
  347. }
  348.  
  349. long long getMaxId() {
  350. DataCenter dc1 = minimum(root)->dataCenter;
  351. DataCenter dc2 = maximum(root)->dataCenter;
  352. cout << dc1.id << " " << dc2.id << endl;
  353. if(multiply(dc1) == multiply(dc2)){
  354. return min(dc1.id, dc2.id);
  355. }
  356. return dc2.id;
  357. }
  358.  
  359. void printTree() {
  360. if (root) {
  361. printHelper(this->root, "", true);
  362. }
  363. }
  364. };
  365.  
  366. int main() {
  367. long long n, m, q;
  368. scanf("%lld %lld %lld", &n, &m, &q);
  369.  
  370. auto *dataCenter = new DataCenter[n];
  371. for (long long i = 0; i < n; ++i) {
  372. dataCenter[i] = DataCenter(i, m);
  373. }
  374.  
  375. RedBlackTree rbTree;
  376. for (long long i = 0; i < n; ++i) {
  377. rbTree.insert(dataCenter[i]);
  378. }
  379.  
  380. rbTree.printTree();
  381.  
  382. char inputValue[10];
  383. long long dataCenterId, serverId;
  384. for (long long i = 0; i < q; ++i) {
  385. scanf("%s", inputValue);
  386. if (strcmp(inputValue, "DISABLE") == 0) {
  387. scanf("%lld %lld", &dataCenterId, &serverId);
  388. dataCenterId--; serverId--;
  389. if(!dataCenter[dataCenterId].servers[serverId]){
  390. rbTree.remove(dataCenter[dataCenterId]);
  391. dataCenter[dataCenterId].servers[serverId] = true;
  392. dataCenter[dataCenterId].countAliveServers--;
  393. rbTree.insert(dataCenter[dataCenterId]);
  394. //___________________
  395. rbTree.printTree();
  396. }
  397. }
  398. else if (strcmp(inputValue, "RESET") == 0) {
  399. scanf("%lld", &dataCenterId);
  400. dataCenterId--;
  401. rbTree.remove(dataCenter[dataCenterId]);
  402. dataCenter[dataCenterId].countAliveServers = m;
  403. dataCenter[dataCenterId].countRestarts++;
  404. memset(dataCenter[dataCenterId].servers, false, m);
  405. rbTree.insert(dataCenter[dataCenterId]);
  406. //___________________
  407. rbTree.printTree();
  408. }
  409. else if (strcmp(inputValue, "GETMAX") == 0) {
  410. printf("%lld\n", rbTree.getMaxId() + 1);
  411. }
  412. else if (strcmp(inputValue, "GETMIN") == 0){
  413. printf("%lld\n", rbTree.getMinId() + 1);
  414. }
  415. }
  416. return 0;
  417. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement