Advertisement
mrlantan

Untitled

Dec 20th, 2020
747
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.17 KB | None | 0 0
  1. #include <chrono>
  2. #include <iostream>
  3. #include <iterator>
  4. #include <memory>
  5. #include <vector>
  6. #include <cstdlib>
  7. #include <set>
  8. #include <random>
  9.  
  10. std::vector<int> depths;
  11.  
  12. template <typename ValueType>
  13. struct Node {
  14.     Node(Node* left, Node* right, Node* parent, const ValueType& value)
  15.         : left(left), right(right), parent(parent), value(value) {
  16.     }
  17.     Node* left;
  18.     Node* right;
  19.     Node* parent;
  20.     ValueType value;
  21. };
  22.  
  23. template <typename ValueType>
  24. class Set;
  25.  
  26. template <typename ValueType>
  27. class SetIterator : public std::iterator<struct bidirectional_iterator_tag, ValueType, size_t,
  28.                                          ValueType*, ValueType&> {
  29. public:
  30.     friend class Set<ValueType>;
  31.     SetIterator() : node(nullptr) {
  32.     }
  33.  
  34.     explicit SetIterator(Node<ValueType>* node) : node(node) {
  35.     }
  36.  
  37.     SetIterator(const SetIterator&) = default;
  38.     SetIterator& operator=(const SetIterator&) = default;
  39.  
  40.     SetIterator& operator++() {
  41.         if (node->right) {
  42.             node = node->right;
  43.             while (node->left) {
  44.                 node = node->left;
  45.             }
  46.         } else {
  47.             while (node->parent->right == node) {
  48.                 node = node->parent;
  49.             }
  50.             node = node->parent;
  51.         }
  52.  
  53.         return *this;
  54.     }
  55.  
  56.     SetIterator& operator--() {
  57.         if (node->left) {
  58.             node = node->left;
  59.             while (node->right) {
  60.                 node = node->right;
  61.             }
  62.         } else {
  63.             while (node->parent->left == node) {
  64.                 node = node->parent;
  65.             }
  66.             node = node->parent;
  67.         }
  68.  
  69.         return *this;
  70.     }
  71.  
  72.     SetIterator operator++(int) {
  73.         SetIterator<ValueType> result(node);
  74.         ++*this;
  75.         return result;
  76.     }
  77.  
  78.     SetIterator operator--(int) {
  79.         SetIterator<ValueType> result(node);
  80.         --*this;
  81.         return result;
  82.     }
  83.  
  84.     bool operator==(SetIterator other) {
  85.         return node == other.node;
  86.     }
  87.  
  88.     bool operator!=(SetIterator other) {
  89.         return node != other.node;
  90.     }
  91.  
  92.     const ValueType& operator*() {
  93.         return node->value;
  94.     }
  95.  
  96.     const ValueType* operator->() {
  97.         return &(node->value);
  98.     }
  99.  
  100. private:
  101.     Node<ValueType>* node;
  102. };
  103.  
  104. template <typename ValueType>
  105. class Set {
  106. private:
  107.     void SetRoot(Node<ValueType>* node) {
  108.         root_ = node;
  109.         begin_ = node;
  110.         end_->left = root_;
  111.         root_->parent = end_;
  112.     }
  113.  
  114.     Node<ValueType>* DeepCopy(Node<ValueType>* cur) {
  115.         auto new_cur = new Node<ValueType>(nullptr, nullptr, nullptr, cur->value);
  116.         if (!(new_cur->value < begin_->value) && !(begin_->value < new_cur->value)) {
  117.             delete begin_;
  118.             begin_ = new_cur;
  119.         }
  120.  
  121.         if (cur->left) {
  122.             new_cur->left = DeepCopy(cur->left);
  123.             new_cur->left->parent = new_cur;
  124.         }
  125.  
  126.         if (cur->right) {
  127.             new_cur->right = DeepCopy(cur->right);
  128.             new_cur->right->parent = new_cur;
  129.         }
  130.  
  131.         return new_cur;
  132.     }
  133.  
  134.     void ZigZig(Node<ValueType>* node) const {
  135.         auto parent = node->parent;
  136.         auto grand_parent = parent->parent;
  137.         auto grand_grand_parent = grand_parent->parent;
  138.  
  139.         bool is_root = root_ == grand_parent;
  140.  
  141.         parent->parent = grand_parent->parent;
  142.         if (grand_grand_parent->left == grand_parent) {
  143.             grand_grand_parent->left = parent;
  144.         } else {
  145.             grand_grand_parent->right = parent;
  146.         }
  147.  
  148.         grand_parent->left = parent->right;
  149.         if (parent->right) {
  150.             parent->right->parent = grand_parent;
  151.         }
  152.  
  153.         grand_parent->parent = parent;
  154.         parent->right = grand_parent;
  155.  
  156.         if (is_root) {
  157.             const_cast<Set<ValueType>*>(this)->root_ = parent;
  158.         }
  159.     }
  160.  
  161.     void ZagZag(Node<ValueType>* node) const {
  162.         auto parent = node->parent;
  163.         auto grand_parent = parent->parent;
  164.         auto grand_grand_parent = grand_parent->parent;
  165.  
  166.         bool is_root = grand_parent == root_;
  167.  
  168.         parent->parent = grand_parent->parent;
  169.         if (grand_grand_parent->left == grand_parent) {
  170.             grand_grand_parent->left = parent;
  171.         } else {
  172.             grand_grand_parent->right = parent;
  173.         }
  174.  
  175.         grand_parent->right = parent->left;
  176.         if (parent->left) {
  177.             parent->left->parent = grand_parent;
  178.         }
  179.  
  180.         grand_parent->parent = parent;
  181.         parent->left = grand_parent;
  182.  
  183.         if (is_root) {
  184.             const_cast<Set<ValueType>*>(this)->root_ = parent;
  185.         }
  186.     }
  187.  
  188.     void ZagZig(Node<ValueType>* node) const {
  189.         auto parent = node->parent;
  190.  
  191.         parent->parent->left = node;
  192.         node->parent = parent->parent;
  193.  
  194.         parent->right = node->left;
  195.         if (node->left) {
  196.             node->left->parent = parent;
  197.         }
  198.  
  199.         node->left = parent;
  200.         parent->parent = node;
  201.  
  202.         ZigZig(parent);
  203.     }
  204.  
  205.     void ZigZag(Node<ValueType>* node) const {
  206.         auto parent = node->parent;
  207.  
  208.         parent->parent->right = node;
  209.         node->parent = parent->parent;
  210.  
  211.         parent->left = node->right;
  212.         if (node->right) {
  213.             node->right->parent = parent;
  214.         }
  215.  
  216.         parent->parent = node;
  217.         node->right = parent;
  218.  
  219.         ZagZag(parent);
  220.     }
  221.  
  222.     void Zig(Node<ValueType>* node) const {
  223.         auto parent = node->parent;
  224.  
  225.         parent->parent->left = node;
  226.         node->parent = parent->parent;
  227.  
  228.         parent->left = node->right;
  229.         if (node->right) {
  230.             node->right->parent = parent;
  231.         }
  232.  
  233.         node->right = parent;
  234.         parent->parent = node;
  235.  
  236.         const_cast<Set<ValueType>*>(this)->root_ = node;
  237.     }
  238.  
  239.     void Zag(Node<ValueType>* node) const {
  240.         auto parent = node->parent;
  241.  
  242.         parent->parent->left = node;
  243.         node->parent = parent->parent;
  244.  
  245.         parent->right = node->left;
  246.         if (node->left) {
  247.             node->left->parent = parent;
  248.         }
  249.  
  250.         node->left = parent;
  251.         parent->parent = node;
  252.  
  253.         const_cast<Set<ValueType>*>(this)->root_ = node;
  254.     }
  255.  
  256.     void SplayNode(Node<ValueType>* node) const {
  257.         while (node != root_) {
  258.             if (node->parent == root_) {
  259.                 if (root_->left == node) {
  260.                     Zig(node);
  261.                 } else {
  262.                     Zag(node);
  263.                 }
  264.                 continue;
  265.             }
  266.  
  267.             auto parent = node->parent;
  268.             bool is_left_child = node->parent->left == node;
  269.             bool is_parent_left_child = parent->parent->left == parent;
  270.  
  271.             if (is_parent_left_child) {
  272.                 if (is_left_child) {
  273.                     ZigZig(node);
  274.                 } else {
  275.                     ZagZig(node);
  276.                 }
  277.             } else {
  278.                 if (is_left_child) {
  279.                     ZigZag(node);
  280.                 } else {
  281.                     ZagZag(node);
  282.                 }
  283.             }
  284.         }
  285.     }
  286.  
  287.     SetIterator<ValueType> LowerBound(Node<ValueType>* node, const ValueType& value) const {
  288.         if (!(value < node->value) && !(node->value < value)) {
  289.             return SetIterator{node};
  290.         }
  291.  
  292.         auto child = node;
  293.  
  294.         bool is_left = true;
  295.  
  296.         if (value < node->value) {
  297.             is_left = true;
  298.             child = node->left;
  299.         } else {
  300.             is_left = false;
  301.             child = node->right;
  302.         }
  303.  
  304.         if (!child) {
  305.             if (is_left) {
  306.                 return SetIterator{node};
  307.             } else {
  308.                 auto iter = SetIterator<ValueType>(node);
  309.                 ++iter;
  310.                 return iter;
  311.             }
  312.         } else {
  313.             return LowerBound(child, value);
  314.         };
  315.     }
  316.  
  317.     void Delete(Node<ValueType>* cur) {
  318.         if (cur->left) {
  319.             Delete(cur->left);
  320.         }
  321.  
  322.         if (cur->right) {
  323.             Delete(cur->right);
  324.         }
  325.  
  326.         delete cur;
  327.     }
  328.  
  329.     Node<ValueType>* root_ = nullptr;
  330.     Node<ValueType>* end_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  331.     Node<ValueType>* begin_ = end_;
  332.     size_t size_ = 0;
  333.  
  334. public:
  335.     typedef SetIterator<ValueType> iterator;
  336.  
  337.     Set() {
  338.     }
  339.  
  340.     template <typename ForwardIT>
  341.     Set(ForwardIT begin, ForwardIT end) {
  342.         for (auto it = begin; it != end; ++it) {
  343.             insert(*it);
  344.         }
  345.     }
  346.  
  347.     explicit Set(std::initializer_list<ValueType> ilist) {
  348.         for (const auto& elem : ilist) {
  349.             insert(elem);
  350.         }
  351.     }
  352.  
  353.     Set(const Set& other) {
  354.         if (other.size_ == 0) {
  355.             return;
  356.         }
  357.  
  358.         begin_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  359.         begin_->value = other.begin_->value;
  360.         root_ = DeepCopy(other.root_);
  361.  
  362.         end_->left = root_;
  363.         root_->parent = end_;
  364.  
  365.         size_ = other.size_;
  366.     }
  367.  
  368.     Set& operator=(const Set& other) {
  369.         if (this == &other) {
  370.             return *this;
  371.         }
  372.  
  373.         this->~Set();
  374.         end_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  375.  
  376.         if (other.size_ == 0) {
  377.             size_ = 0;
  378.             root_ = nullptr;
  379.             begin_ = end_;
  380.             end_->left = root_;
  381.  
  382.             return *this;
  383.         }
  384.  
  385.         begin_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  386.         begin_->value = other.begin_->value;
  387.         root_ = DeepCopy(other.root_);
  388.  
  389.         end_->left = root_;
  390.         root_->parent = end_;
  391.  
  392.         size_ = other.size_;
  393.         return *this;
  394.     }
  395.  
  396.     ~Set() {
  397.         if (end_) {
  398.             std::vector<Node<ValueType>*> nodes(size_);
  399.             int counter = 0;
  400.             for (auto iter = begin(); iter != end(); ++iter) {
  401.                 nodes[counter] = iter.node;
  402.                 ++counter;
  403.             }
  404.  
  405.             for (size_t i = 0; i < nodes.size(); ++i) {
  406.                 delete nodes[i];
  407.             }
  408.  
  409.             delete end_;
  410.         }
  411.     }
  412.  
  413.     size_t size() const {
  414.         return size_;
  415.     }
  416.  
  417.     bool empty() const {
  418.         return size_ == 0;
  419.     }
  420.  
  421.     void insert(const ValueType& value) {
  422.         auto node = new Node<ValueType>(nullptr, nullptr, nullptr, value);
  423.         if (!root_) {
  424.             SetRoot(node);
  425.             ++size_;
  426.             return;
  427.         }
  428.  
  429.         find(value);
  430.  
  431.         if (!(root_->value < value) && !(value < root_->value)) {
  432.             delete node;
  433.             return;
  434.         }
  435.  
  436.         if (value < root_->value) {
  437.             node->right = root_;
  438.             root_->parent = node;
  439.  
  440.             if (root_->left) {
  441.                 node->left = root_->left;
  442.                 root_->left->parent = node;
  443.                 root_->left = nullptr;
  444.             }
  445.         } else {
  446.             node->left = root_;
  447.             root_->parent = node;
  448.  
  449.             if (root_->right) {
  450.                 node->right = root_->right;
  451.                 root_->right->parent = node;
  452.                 root_->right = nullptr;
  453.             }
  454.         }
  455.  
  456.         node->parent = end_;
  457.         end_->left = node;
  458.         root_ = node;
  459.  
  460.         if (node->value < begin_->value) {
  461.             begin_ = node;
  462.         }
  463.  
  464.         ++size_;
  465.     }
  466.  
  467.     void erase(const ValueType& value) {
  468.         if (!root_) {
  469.             return;
  470.         }
  471.  
  472.         find(value);
  473.  
  474.         if ((root_->value < value) || (value < root_->value)) {
  475.             return;
  476.         }
  477.  
  478.         if (begin_ == root_) {
  479.             auto iter = SetIterator<ValueType>(root_);
  480.             ++iter;
  481.             begin_ = iter.node;
  482.         }
  483.  
  484.         if (!root_->left) {
  485.             auto old_root = root_;
  486.             end_->left = root_->right;
  487.  
  488.             if (root_->right) {
  489.                 root_->right->parent = root_->parent;
  490.                 root_ = root_->right;
  491.             } else {
  492.                 root_ = nullptr;
  493.             }
  494.  
  495.             delete old_root;
  496.             --size_;
  497.             return;
  498.         }
  499.  
  500.         auto right_tree = root_->right;
  501.  
  502.         Node<ValueType>* old_root = root_;
  503.         root_ = root_->left;
  504.         find(value);
  505.  
  506.         root_->right = right_tree;
  507.         if (right_tree) {
  508.             right_tree->parent = root_;
  509.         }
  510.         end_->left = root_;
  511.         root_->parent = end_;
  512.         --size_;
  513.         delete old_root;
  514.     }
  515.  
  516.     SetIterator<ValueType> find(const ValueType& value) const {
  517.         if (size_ == 0) {
  518.             return SetIterator{end_};
  519.         }
  520.  
  521.         int depth = 0;
  522.  
  523.         Node<ValueType>* node = root_;
  524.  
  525.         while (node) {
  526.             if (!(node->value < value) && !(value < node->value)) {
  527.                 depths.push_back(depth);
  528.                 SplayNode(node);
  529.                 return SetIterator(node);
  530.             }
  531.  
  532.             Node<ValueType>* child = nullptr;
  533.             if (node->value < value) {
  534.                 child = node->right;
  535.             } else {
  536.                 child = node->left;
  537.             }
  538.  
  539.             if (!child) {
  540.                 depths.push_back(depth);
  541.                 SplayNode(node);
  542.                 return SetIterator{end_};
  543.             } else {
  544.                 node = child;
  545.             }
  546.  
  547.             ++depth;
  548.         }
  549.  
  550.         return SetIterator{end_};
  551.     }
  552.  
  553.     SetIterator<ValueType> lower_bound(const ValueType& value) const {
  554.         if (size_ == 0) {
  555.             return SetIterator{end_};
  556.         }
  557.  
  558.         return LowerBound(root_, value);
  559.     }
  560.  
  561.     SetIterator<ValueType> begin() const {
  562.         return SetIterator{begin_};
  563.     }
  564.  
  565.     SetIterator<ValueType> end() const {
  566.         return SetIterator{end_};
  567.     }
  568. };
  569.  
  570. std::ostream& operator<<(std::ostream& os, const std::vector<int> vec) {
  571.     for (auto elem : vec) {
  572.         os << elem;
  573.     }
  574.  
  575.     return os;
  576. }
  577.  
  578. void TestInsert() {
  579.     std::vector<int> sorted = {1, 2, 3, 4, 5, 6, 7, 8};
  580.     std::vector<int> shuffled = sorted;
  581.  
  582.     while (std::next_permutation(shuffled.begin(), shuffled.end())) {
  583.         Set<int> s(shuffled.begin(), shuffled.end());
  584.         std::vector<int> from_set;
  585.         for (auto elem : s) {
  586.             from_set.push_back(elem);
  587.         }
  588.  
  589.         if (from_set != sorted) {
  590.             std::cout << shuffled;
  591.             exit(0);
  592.         }
  593.     }
  594. }
  595.  
  596. void TestFind() {
  597.     Set<int> s{1, 6, 3, 8, 2, 4, 7, 5};
  598.     auto iter = s.find(1);
  599.     assert(*iter == 1);
  600.     assert(iter == s.begin());
  601.     assert(iter != s.end());
  602.  
  603.     iter = s.find(9);
  604.     assert(iter == s.end());
  605.     assert(iter != s.begin());
  606. }
  607.  
  608. void TestErase() {
  609.     Set<int> s{1, 6, 3, 8, 2, 4, 7, 5};
  610.  
  611.     for (int i = 0; i <= 9; ++i) {
  612.         s.erase(i);
  613.         assert(s.find(i) == s.end());
  614.     }
  615.  
  616.     assert(s.empty());
  617.  
  618.     s = Set{1, 6, 3, 8, 2, 4, 7, 5};
  619.  
  620.     s.erase(9u);
  621.     assert(s.size() == 8u);
  622.     s.erase(4);
  623.     s.erase(4);
  624.     s.erase(4);
  625.     assert(s.size() == 7u);
  626. }
  627.  
  628. void TestLowerBound() {
  629.     Set<int> s = Set{1, 5, 6, 9, 12};
  630.  
  631.     std::vector<int> ans = {1, 1, 5, 5, 5, 5, 6, 9, 9, 9, 12, 12, 12};
  632.     for (int i = 0; i <= 12; ++i) {
  633.         auto iter = s.lower_bound(i);
  634.         assert(*iter == ans[i]);
  635.     }
  636.  
  637.     assert(s.lower_bound(13) == s.end());
  638. }
  639.  
  640. void TestBig() {
  641.     Set<int> s;
  642.     std::vector<int> vec;
  643.  
  644.     for (int i = 0; i < 1000000; ++i) {
  645.         vec.push_back(i);
  646.     }
  647.  
  648.     std::shuffle(vec.begin(), vec.end(), std::mt19937());
  649.  
  650.     for (auto i : vec) {
  651.         s.insert(i);
  652.     }
  653.  
  654.     std::shuffle(vec.begin(), vec.end(), std::mt19937());
  655.  
  656.     for (int i = 0; i < 1000000; ++i) {
  657.         s.find(vec[i]);
  658.     }
  659.  
  660.     std::shuffle(vec.begin(), vec.end(), std::mt19937());
  661.  
  662.     for (int i = 0; i < 1000000; ++i) {
  663.         s.erase(vec[i]);
  664.     }
  665. }
  666.  
  667. int main() {
  668. //    TestLowerBound();
  669. //    TestInsert();
  670. //    TestErase();
  671. //    TestFind();
  672.     TestBig();
  673.  
  674.     std::cout << depths.size() << std::endl;
  675.     int64_t sum = 0;
  676.     for (int i = 0; i < depths.size(); ++i) {
  677.         sum += (int64_t)depths[i];
  678.     }
  679.  
  680.     std::cout << sum / (double)depths.size() << std::endl;
  681.  
  682.     return 0;
  683. }
  684.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement