Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
#include
#include
#include
enum QueueCodes { EmptyHead, Success }; enum HeapCodes { EmptyHeap, Successfuly }; template
class Queue { private: struct Node { T value; Node* next_node; Node* previous_node; }; Node* head_; Node* tail_; size_t size_; public: Queue(); ~Queue(); bool Empty(); size_t GetSize(); std::pair
GetTail(); void Push(T value); std::pair
Pop(); std::pair
PopFront(); void DeleteQueue(); }; template
class BinHeap { public: BinHeap(); ~BinHeap(); void ExtractMin(); void DecreaseKey(void* target, T delta); std::pair
GetMin(); void* Insert(T value); private: struct Node { T value; Node* parent; Node* left_child; Node* right_child; void SiftUp(); void SiftDown(); }; Queue
leafs_; Node* head_; size_t size_; }; template
void DoOperation(BinHeap
& heap, std::vector
& nodes, std::string operation) { if (operation == "insert") { T value; std::cin >> value; nodes.push_back(heap.Insert(value)); } else if (operation == "getMin") { std::cout << heap.GetMin().second << "\n"; nodes.push_back(nullptr); } else if (operation == "extractMin") { heap.ExtractMin(); nodes.push_back(nullptr); } else { int ptr; int delta; std::cin >> ptr >> delta; heap.DecreaseKey(nodes[ptr - 1], delta); nodes.push_back(nullptr); } } int main() { std::vector
nodes; BinHeap
heap; int n; std::cin >> n; while (n-- != 0) { std::string operation; std::cin >> operation; DoOperation
(heap, nodes, operation); } } template
Queue
::Queue() { head_ = nullptr; tail_ = nullptr; size_ = 0; } template
Queue
::~Queue() { DeleteQueue(); } template
bool Queue
::Empty() { return head_ == nullptr; } template
size_t Queue
::GetSize() { return size_; } template
std::pair
Queue
::GetTail() { if (tail_ != nullptr) { return {Success, tail_->value}; } return {EmptyHead, T()}; } template
void Queue
::Push(T value) { Node* new_head = new Node({value, head_, nullptr}); if (tail_ == nullptr) { tail_ = new_head; } if (head_ != nullptr) { head_->previous_node = new_head; } head_ = new_head; ++size_; } template
std::pair
Queue
::Pop() { if (tail_ == nullptr) { return {EmptyHead, T()}; } else if (tail_ == head_) { T value = tail_->value; delete tail_; tail_ = nullptr; head_ = nullptr; --size_; return {Success, value}; } T value = tail_->value; tail_ = tail_->previous_node; delete tail_->next_node; --size_; return {Success, value}; } template
std::pair
Queue
::PopFront() { if (head_ == nullptr) { return {EmptyHead, T()}; } else if (tail_ == head_) { T value = tail_->value; delete tail_; tail_ = nullptr; head_ = nullptr; --size_; return {Success, value}; } T value = head_->value; head_ = head_->next_node; delete head_->previous_node; return {Success, value}; } template
void Queue
::DeleteQueue() { while (head_) { Node* tmp = head_; head_ = head_->next_node; delete tmp; } tail_ = nullptr; size_ = 0; } template
BinHeap
::BinHeap() { head_ = nullptr; size_ = 0; } template
BinHeap
::~BinHeap() { while (!leafs_.Empty()) { Node* leaf = leafs_.Pop().second; delete leaf; } } template
void BinHeap
::ExtractMin() { if (size_ == 1) { delete head_; size_ = 0; head_ = nullptr; } else { Node* leaf = leafs_.Pop().second; head_->value = leaf->value; Node* parent = leaf->parent; if (parent->left_child == leaf) { parent->left_child = nullptr; delete leaf; } else { parent->right_child = nullptr; delete leaf; } head_->SiftDown(); } } template
void BinHeap
::DecreaseKey(void *target, T delta) { Node* target_node = (Node*)target; target_node->value -= delta; target_node->SiftUp(); } template
std::pair
BinHeap
::GetMin() { if (head_ == nullptr) { return {EmptyHeap, T()}; } else { return {Successfuly, head_->value}; } } template
void* BinHeap
::Insert(T value) { ++size_; if (head_ == nullptr) { head_ = new Node{value, nullptr, nullptr, nullptr }; leafs_.Push(head_); return (void*)head_; } Node* leaf = leafs_.GetTail().second; if (leaf->left_child == nullptr) { leaf->left_child = new Node{value, leaf, nullptr, nullptr }; leafs_.Push(leaf->left_child); leafs_.Pop(); leaf->left_child->SiftUp(); return (void*)leaf->left_child; } leaf->right_child = new Node{value, leaf, nullptr, nullptr }; leafs_.Push(leaf->right_child); leafs_.Pop(); leaf->right_child->SiftUp(); return (void*)leaf->right_child; } template
void BinHeap
::Node::SiftUp() { if (parent != nullptr && parent->value > value) { T temporary_value = value; value = parent->value; parent->value = temporary_value; parent->SiftUp(); } } template
void BinHeap
::Node::SiftDown() { if (left_child != nullptr && right_child != nullptr) { Node* min_neighbour = (left_child->value <= right_child->value) ? left_child:right_child; if (min_neighbour->value < value) { T temporary_value = value; value = min_neighbour->value; min_neighbour->value = temporary_value; min_neighbour->SiftDown(); } } else if ((left_child == nullptr) != (right_child == nullptr)) { Node* min_neighbour = (left_child != nullptr) ? left_child:right_child; if (min_neighbour->value < value) { T temporary_value = value; value = min_neighbour->value; min_neighbour->value = temporary_value; min_neighbour->SiftDown(); } } }
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)