Untitled
unknown
plain_text
2 years ago
11 kB
11
Indexable
#include "main.h"
int MAXSIZE = 0;
class JJK_RESTAURANT_OPERATIONS;
class RESTAURANT_Gojo;
class RESTAURANT_Sukuna;
class HuffTree_AVL;
class RESTAURANT_Gojo
{
class Tree_BST;
private:
vector<Tree_BST> areaTable;
public:
RESTAURANT_Gojo() : areaTable(MAXSIZE + 1) {}
void insertAreaTable(int result)
{
int ID = result % MAXSIZE + 1;
areaTable[ID].insert(result);
}
void remove_KOKUSEN()
{
for (int i = 1; i < MAXSIZE + 1; i++)
areaTable[i].remove();
}
void print_LIMITLESS(int number)
{
if (number <= 0 || number > MAXSIZE)
return; //! quá kí tự
areaTable[number].print();
}
private:
class Tree_BST
{
class Node;
private:
Node *root;
queue<int> queueTime;
public:
Tree_BST() : root(nullptr) {}
~Tree_BST()
{
while (!queueTime.empty())
{
int temp = queueTime.front();
queueTime.pop();
root = remove_recursive(root, temp);
}
}
int size()
{
return queueTime.size();
}
Node *insert_recursive(Node *node, int result)
{
if (!node)
return new Node(result);
if (result < node->result)
{
node->left = insert_recursive(node->left, result);
}
else
{
node->right = insert_recursive(node->right, result);
}
return node;
}
void insert(int result)
{
root = insert_recursive(root, result);
queueTime.push(result);
}
Node *remove_recursive(Node *node, int result)
{
if (!node)
return nullptr;
if (result < node->result)
{
node->left = remove_recursive(node->left, result);
}
else if (result > node->result)
{
node->right = remove_recursive(node->right, result);
}
if (node->result == result)
{
Node *nodeDel = node;
if (!node->left && !node->right)
{
node = nullptr;
}
else if (!node->left)
{
node = node->right;
}
else if (!node->right)
{
node = node->left;
}
else
{
Node *tmp = node->right;
while (tmp->left != nullptr)
{
tmp = tmp->left;
}
swap(tmp->result, node->result);
node->right = remove_recursive(node->right, result);
return node;
}
delete nodeDel;
}
return node;
}
int CountNode(Node *node)
{
return node == NULL ? 0 : 1 + CountNode(node->left) + CountNode(node->right);
}
unsigned long long DFS(Node *node, const vector<vector<long long>> &dp)
{
if (node == NULL)
return 1;
int nleft = CountNode(node->left);
int nRight = CountNode(node->right);
return (unsigned long long)(dp[nleft + nRight][nleft] % MAXSIZE * (DFS(node->left, dp) % MAXSIZE * DFS(node->right, dp) % MAXSIZE) % MAXSIZE) % MAXSIZE;
}
void PascalTriangle(int n, vector<vector<long long>> &dp)
{
for (int i = 0; i <= n; i++)
{
dp[i] = vector<long long>(i + 1, 1); // initially all 1
for (int j = 1; j < i; j++)
{
dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j]);
}
}
}
void remove()
{
if (this->size() == 0)
return; //! trường hợp rỗng bỏ qua
vector<vector<long long>> dp(queueTime.size() + 1);
PascalTriangle(queueTime.size(), dp);
unsigned long long number = DFS(root, dp);
while (number != 0 && !queueTime.empty())
{
int temp = queueTime.front(); //! tìm khách hàng đầu tiên được lưu trong sổ và lấy được vị trí nó rồi
queueTime.pop(); //! xóa nó khỏi sổ
root = remove_recursive(root, temp); //! tới chỗ nó cho nó cút khỏi nhà hàng
number--;
}
}
//^ test case thôi nộp bài thì xóa đi nha --------------------------------------------------------------------
string test_print_recursive(Node* node)
{
if(node == nullptr) return "NULL"; //! trường hợp dừng print
if(node->left == nullptr && node->right == nullptr) return to_string(node->result); //! tr
return to_string(node->result)+"("+test_print_recursive(node->left) +","+test_print_recursive(node->right)+")";
}
void test_print(){
//! trường hợp rỗng bỏ qua
if(this->size() == 0){
solution << "Tree: EMPTY\n";
return;
}
solution << "Tree: " << test_print_recursive(root);
solution << "\n";
}
//^ ----------------------------------------------------------------------------------------------------------
void print_recursive(Node *node)
{
if (node != NULL)
{
solution << node->result << "\n";
print_recursive(node->left);
print_recursive(node->right);
}
}
void print()
{
//^ test case thôi nộp bài thì xóa đi nha --------------------------------------------------------------------
test_print();
//^ ----------------------------------------------------------------------------------------------------------
// print_recursive(root);
}
private:
class Node
{
private:
int result;
Node *left;
Node *right;
friend class Tree_BST;
public:
Node(int result) : result(result), left(NULL), right(NULL) {}
};
};
};
class RESTAURANT_Sukuna
{
class Node;
private:
vector<Node *> areaTable;
list<Node *> LRU;
private:
Node *whoFirst(Node *a, Node *b)
{
for (Node *it : LRU)
{
if (it == a)
return b;
if (it == b)
return a;
}
return nullptr;
}
void ReHeap_down(int index)
{
int leftChild = 2 * index + 1;
int rightChild = 2 * index + 2;
int smallest = index;
if (leftChild < areaTable.size())
{
if (areaTable[leftChild]->size() < areaTable[smallest]->size())
{
smallest = leftChild;
}
else if (areaTable[leftChild]->size() == areaTable[smallest]->size())
{
if (whoFirst(areaTable[leftChild], areaTable[smallest]) == areaTable[leftChild])
{
smallest = leftChild;
}
}
}
if (rightChild < areaTable.size())
{
if (areaTable[rightChild]->size() < areaTable[smallest]->size())
{
smallest = rightChild;
}
else if (areaTable[rightChild]->size() == areaTable[smallest]->size())
{
if (whoFirst(areaTable[rightChild], areaTable[smallest]) == areaTable[rightChild])
{
smallest = rightChild;
}
}
}
if (smallest != index)
{
swap(areaTable[index], areaTable[smallest]);
ReHeap_down(smallest);
}
}
void ReHeap_up(int index)
{
while (index > 0)
{
int parent = (index - 1) / 2;
if (areaTable[index]->size() < areaTable[parent]->size() || (areaTable[index]->size() == areaTable[parent]->size() && whoFirst(areaTable[index], areaTable[parent]) == areaTable[index]))
{
swap(areaTable[index], areaTable[parent]);
index = parent;
}
else
break;
}
}
void moveTop(Node *node)
{
list<Node *>::iterator it = std::find(LRU.begin(), LRU.end(), node);
if (it != LRU.end())
{
LRU.erase(it);
}
LRU.push_front(node);
}
void removeNode(Node *node)
{
list<Node *>::iterator it = find(LRU.begin(), LRU.end(), node);
LRU.erase(it);
}
public:
RESTAURANT_Sukuna() {}
~RESTAURANT_Sukuna()
{
for (int i = 0; i < areaTable.size(); i++)
delete areaTable[i];
}
void insertAreaTable(int result)
{
int ID = result % MAXSIZE + 1;
int index = -1;
for (int i = 0; i < areaTable.size(); i++)
{
if (ID == areaTable[i]->ID)
index = i;
}
if (index == -1)
{
areaTable.push_back(new Node(ID));
index = areaTable.size() - 1;
areaTable[index]->insert(result);
this->moveTop(areaTable[index]);
this->ReHeap_up(index);
}
else
{
areaTable[index]->insert(result);
this->moveTop(areaTable[index]);
this->ReHeap_down(index);
}
}
void remove_KEITEIKEN(int number)
{
if (areaTable.size() <= 0)
return;
vector<Node *> areaTableNew(areaTable.begin(), areaTable.end());
queue<Node *> listDelete; //! danh sách các khu cấn xóa
for (int i = 0; areaTable.size() && i < number; i++)
{
Node *nodeDelete = areaTable[0];
swap(areaTable[0], areaTable[areaTable.size() - 1]);
areaTable.pop_back();
this->ReHeap_down(0);
listDelete.push(nodeDelete);
}
areaTable = areaTableNew;
while (listDelete.size())
{
Node *nodeDelete = listDelete.front();
listDelete.pop();
solution << "remove customers in the area ID = " << nodeDelete->ID << "(len=" << nodeDelete->head.size() << ")"
<< ": ";
nodeDelete->remove(number);
solution << "\n";
int index = 0;
while (areaTable[index] != nodeDelete)
index++;
if (nodeDelete->size() == 0)
{
swap(areaTable[index], areaTable[areaTable.size() - 1]);
this->removeNode(areaTable[areaTable.size() - 1]);
delete areaTable[areaTable.size() - 1];
areaTable.pop_back();
}
this->ReHeap_down(index);
}
}
void print_pre_order(int index, int number)
{
if (index >= this->areaTable.size())
return;
this->areaTable[index]->print(number);
print_pre_order(index * 2 + 1, number);
print_pre_order(index * 2 + 2, number);
}
void print_LIMITLESS(int number)
{
if (number <= 0)
return;
// solution << "Heap : ";
// for(auto it : this->areaTable)
// {
// int order = 0;
// for (auto ix : LRU) {
// if (ix == it) break;
// ++order;
// }
// solution << it->ID << "(len="<< it->size() <<",index=" << order <<")" << " ";
// }
// solution << "\n";
solution << "Heap : ";
for (auto it : this->areaTable)
solution << it->ID << " ";
solution << "\n";
solution << "list LRU : ";
for (auto it : LRU)
solution << it->ID << " ";
solution << "\n";
print_pre_order(0, number);
}
//^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
private:
class Node
{
private:
int ID; //! ID của bàn đó
list<int> head; //! lưu danh sách các result của khách hàng
friend class RESTAURANT_Sukuna;
public:
Node(int ID) : ID(ID) {}
int size() const { return head.size(); }
void insert(int result) { head.push_front(result); }
void remove(int number)
{
while (number-- && head.size() > 0)
{
solution << head.back() << " ";
head.pop_back();
}
//^ gợi ý dùng hàm của linklist có sẵn
//* thêm solution << head.back() << " "; để in ra
// if(head.size()>0) solution << head.back() << " ";
}
void print(int number)
{
solution << "customers in the area ID = " << ID << "(len=" << head.size() << ")"
<< ": ";
for (list<int>::iterator it = head.begin(); number > 0 && it != head.end(); ++it, --number)
{
solution << *it << " ";
}
solution << "\n";
}
};
};Editor is loading...
Leave a Comment