MaximCherchuk

Algo1

Feb 23rd, 2016
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream in("in.txt");
  6. ofstream out("out.txt");
  7.  
  8. struct compare {
  9.     bool operator()(pair<int, int> a, pair<int, int> b) const {
  10.         if (a.first == b.first) return a.second > b.second;
  11.         else return a.first < b.first;
  12.     }
  13. };
  14.  
  15. typedef set<pair<int, int>, compare> spec_set;
  16.  
  17. spec_set leavesLeft;
  18. spec_set leavesRight;
  19. spec_set leavesUp;
  20.  
  21. class binary_tree {
  22. public:
  23.  
  24.     struct node {
  25.         node() {
  26.             right_descendant = nullptr;
  27.             left_descendant = nullptr;
  28.             ancestor = nullptr;
  29.             key = 0;
  30.         }
  31.         node(int newKey) {
  32.             right_descendant = nullptr;
  33.             left_descendant = nullptr;
  34.             ancestor = nullptr;
  35.             key = newKey;
  36.         }
  37.         node* ancestor;
  38.         node* right_descendant;
  39.         node* left_descendant;
  40.         int key, heigth, way;
  41.     };
  42. private:
  43.     node* tree_root;
  44.     node* pivotal_node;
  45.     map<int, bool> used;
  46. public:
  47.  
  48.     binary_tree() {
  49.         tree_root = pivotal_node = nullptr;
  50.     }
  51.  
  52.     void add_key(int key) {
  53.         add_to_tree(&tree_root, nullptr, key);
  54.     }
  55.  
  56.     void build_tree() {
  57.         build_ways(tree_root);
  58.     }
  59.  
  60.     void print() {
  61.         print_tree(pivotal_node);
  62.     }
  63.  
  64.     void find_pivotal_vertex() {
  65.         node* temp = tree_root;
  66.         find_maxway(tree_root, &temp);
  67.         if ((temp->way & 1) || (temp->way == 0)) {
  68.             pivotal_node = tree_root;
  69.             return;
  70.         }
  71.         int node_1, node_2;
  72.         if(temp->left_descendant == nullptr) {
  73.             node_1 = -1;
  74.         } else {
  75.             node_1 = temp->left_descendant->heigth;
  76.         }
  77.        
  78.         if(temp->right_descendant == nullptr) {
  79.             node_2 = -1;
  80.         } else {
  81.             node_2 = temp->right_descendant->heigth;
  82.         }
  83.  
  84.         if (node_1 > node_2) {
  85.             pivotal_node = temp->left_descendant;
  86.             node_2++;
  87.             node_1--;
  88.             while (node_1 > node_2) {
  89.                 int node_3, node_4;
  90.                 if(pivotal_node->left_descendant == nullptr) {
  91.                     node_3 = -1;
  92.                 } else {
  93.                     node_3 = pivotal_node->left_descendant->heigth;
  94.                 }
  95.                
  96.                 if(pivotal_node->right_descendant == nullptr) {
  97.                     node_4 = -1;
  98.                 } else {
  99.                     node_4 = pivotal_node->right_descendant->heigth;
  100.                 }
  101.                
  102.                 if (node_3 >= node_4) {
  103.                     pivotal_node = pivotal_node->left_descendant;
  104.                 } else {
  105.                     pivotal_node = pivotal_node->right_descendant;
  106.                 }
  107.                 node_2++;
  108.                 node_1--;
  109.             }
  110.         } else {
  111.             pivotal_node = temp->right_descendant;
  112.             node_1++;
  113.             node_2--;
  114.             while (node_2 > node_1) {
  115.                 int node_3, node_4;
  116.                 if(pivotal_node->left_descendant == nullptr) {
  117.                     node_3 = -1;
  118.                 } else {
  119.                     node_3 = pivotal_node->left_descendant->heigth;
  120.                 }
  121.                
  122.                 if(pivotal_node->right_descendant == nullptr) {
  123.                     node_4 = -1;
  124.                 } else {
  125.                     node_4 = pivotal_node->right_descendant->heigth;
  126.                 }
  127.                
  128.                 if (node_3 >= node_4) {
  129.                     pivotal_node = pivotal_node->left_descendant;
  130.                 } else {
  131.                     pivotal_node = pivotal_node->right_descendant;
  132.                 }
  133.                 node_1++;
  134.                 node_2--;
  135.             }
  136.         }
  137.         rotate_tree();
  138.     }
  139.  
  140. private:
  141.  
  142.     void add_to_tree(node** ptr, node* temp_ancestor, int value) {
  143.         if (*ptr == nullptr) {
  144.             *ptr = new node(value);
  145.             (*ptr)->ancestor = temp_ancestor;
  146.             return;
  147.         }
  148.         if (value < (*ptr)->key) {
  149.             add_to_tree(&((*ptr)->left_descendant), *ptr, value);
  150.         } else if (value > (*ptr)->key) {
  151.             add_to_tree(&((*ptr)->right_descendant), *ptr, value);
  152.         }
  153.     }
  154.  
  155.     void build_ways(node* ptr) {
  156.         if (ptr == nullptr) return;
  157.         build_ways(ptr->left_descendant);
  158.         build_ways(ptr->right_descendant);
  159.         int left_height = -1, right_height = -1;
  160.         if (ptr->left_descendant != nullptr) {
  161.             left_height = ptr->left_descendant->heigth;
  162.         }
  163.         if (ptr->right_descendant != nullptr) {
  164.             right_height = ptr->right_descendant->heigth;
  165.         }
  166.         int min_h(left_height < right_height ? left_height : right_height);
  167.         int max_h(left_height > right_height ? left_height : right_height);
  168.  
  169.         ptr->heigth = max_h + 1;
  170.         if (min_h == -1) {
  171.             ptr->way = max_h + 1;
  172.         } else {
  173.             if (left_height == right_height) {
  174.                 ptr->way = left_height + right_height + 1;
  175.             } else {
  176.                 ptr->way = left_height + right_height + 2;
  177.             }
  178.         }
  179.     }
  180.  
  181.     void print_tree(node* ptr) {
  182.         if (ptr != nullptr) {
  183.             out << ptr->key << endl;
  184.             print_tree(ptr->left_descendant);
  185.             print_tree(ptr->right_descendant);
  186.         }
  187.     }
  188.  
  189.     void find_maxway(node* ptr, node** max_way) {
  190.         if (ptr != nullptr) {
  191.             find_maxway(ptr->left_descendant, &(*max_way));
  192.             if (ptr->way > (*max_way)->way)
  193.                 *max_way = ptr;
  194.             find_maxway(ptr->right_descendant, &(*max_way));
  195.         }
  196.     }
  197.  
  198.     void rotate_tree() {
  199.         node *temp = pivotal_node;
  200.         while (temp->ancestor != nullptr) {
  201.             node* parent = temp->ancestor;
  202.             node* parent2 = parent->ancestor;
  203.             if (temp->key > temp->ancestor->key) {
  204.                 parent->right_descendant = temp->left_descendant;
  205.                 parent->ancestor = temp;
  206.                 temp->left_descendant = parent;
  207.                 temp->ancestor = parent2;
  208.             } else {
  209.                 parent->left_descendant = temp->right_descendant;
  210.                 parent->ancestor = temp;
  211.                 temp->right_descendant = parent;
  212.                 temp->ancestor = parent2;
  213.  
  214.             }
  215.         }
  216.     }
  217.  
  218.     void set_pivatal_node(node *ptr, int value) {
  219.         if (ptr != nullptr) {
  220.             if (ptr->key == value) {
  221.                 pivotal_node = ptr;
  222.             } else {
  223.                 set_pivatal_node(ptr->left_descendant, value);
  224.                 set_pivatal_node(ptr->right_descendant, value);
  225.             }
  226.         }
  227.     }
  228. public:
  229.  
  230.     void get_tips() {
  231.         node *root = pivotal_node;
  232.         used[root->key] = true;
  233.         find_tips(root->left_descendant, leavesLeft);
  234.         find_tips(root->right_descendant, leavesRight);
  235.         find_tips(root->ancestor, leavesUp);
  236.     }
  237.  
  238.     void find_tips(node *root, spec_set &v, int cur_level = 0) {
  239.         if(root == nullptr) return;
  240.         if (used[root->key]) return;
  241.         used[root->key] = true;
  242.         if((root->left_descendant == nullptr && root->right_descendant == nullptr)
  243.              || (root->left_descendant == nullptr && root->ancestor == nullptr)
  244.              || (root->ancestor == nullptr && root->right_descendant == nullptr))
  245.         {
  246.             v.insert(make_pair(cur_level, root->key));
  247.             return;
  248.         }
  249.         if (root->left_descendant != nullptr)
  250.             find_tips(root->left_descendant, v, cur_level + 1);
  251.         if (root->right_descendant != nullptr)
  252.             find_tips(root->right_descendant, v, cur_level + 1);
  253.         if (root->ancestor != nullptr)
  254.             find_tips(root->ancestor, v, cur_level + 1);
  255.     }
  256.  
  257.     void set_node(int value) {
  258.         node *node = tree_root;
  259.         set_pivatal_node(node, value);
  260.     }
  261.  
  262.     int get_pivotal_key() {
  263.         return pivotal_node->key;
  264.     }
  265. };
  266.  
  267. binary_tree tree;
  268. binary_tree cpy;
  269.  
  270. void input() {
  271.     int key;
  272.     while (in >> key) {
  273.         tree.add_key(key);
  274.         cpy.add_key(key);
  275.     }
  276. }
  277.  
  278. void solve() {
  279.     tree.build_tree();
  280.     tree.find_pivotal_vertex();
  281.     int key = tree.get_pivotal_key();
  282.     cpy.set_node(key);
  283.     cpy.get_tips();
  284. }
  285.  
  286. void output() {
  287.     map<int, set<int> > answer;
  288.     int prev_key = INT_MIN;
  289.     set<pair<int, int>>::reverse_iterator it;
  290.     for(it = leavesLeft.rbegin(); it != leavesLeft.rend(); ++it) {
  291.         int key = it->first;
  292.         int value = it->second;
  293.         if (prev_key == key) continue;
  294.         prev_key = key;
  295.         answer[key].insert(value);
  296.     }
  297.     prev_key = INT_MIN;
  298.     for (it = leavesRight.rbegin(); it != leavesRight.rend(); ++it) {
  299.         int key = it->first;
  300.         int value = it->second;
  301.         if (prev_key == key) continue;
  302.         prev_key = key;
  303.         answer[key].insert(value);
  304.     }
  305.     prev_key = INT_MIN;
  306.     for (it = leavesUp.rbegin(); it != leavesUp.rend(); ++it) {
  307.         int key = it->first;
  308.         int value = it->second;
  309.         if (prev_key == key) continue;
  310.         prev_key = key;
  311.         answer[key].insert(value);
  312.     }
  313.     for (map<int, set<int>>::reverse_iterator it = answer.rbegin(); it != answer.rend(); ++it) {
  314.         pair<int, set<int>> p = *it;
  315.         if (p.second.size() < 2) continue;
  316.         set<int> s = p.second;
  317.         long long ans = *p.second.begin() + *++p.second.begin();
  318.         out << ans << endl;
  319.         break;
  320.     }
  321.     tree.print();
  322. }
  323.  
  324. int main() {
  325.     input();
  326.     solve();
  327.     output();
  328. }
Advertisement
Add Comment
Please, Sign In to add comment