From 701942606e04df4f43cf38fe58933fce4b32b3f6 Mon Sep 17 00:00:00 2001 From: yenru0 Date: Mon, 16 Mar 2026 17:08:40 +0900 Subject: [PATCH] complete 1992.cpp --- storage/zeta/cpp/completed/1992.cpp | 148 ++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 storage/zeta/cpp/completed/1992.cpp diff --git a/storage/zeta/cpp/completed/1992.cpp b/storage/zeta/cpp/completed/1992.cpp new file mode 100644 index 0000000..d53f529 --- /dev/null +++ b/storage/zeta/cpp/completed/1992.cpp @@ -0,0 +1,148 @@ +#include +#include +#include +#include + +#define let auto +#define fn auto +#define usize size_t +using namespace std; + +fn fastio() { + ios::sync_with_stdio(false); + cin.tie(nullptr); +} + +fn check_all(usize a, usize b, usize c, usize d) -> bool { + return a == b && b == c && c == d; +} + +struct Node { + bool is_fb; + usize repr; + Node *ul; + Node *ur; + Node *dl; + Node *dr; +}; + +fn print_node(Node *node) -> void { + if (node->is_fb) { + cout << node->repr; + } else { + cout << "("; + print_node(node->ul); + print_node(node->ur); + print_node(node->dl); + print_node(node->dr); + cout << ")"; + } +} + +fn free_node(Node *node) -> void { + if (node->is_fb) { + + } else { + free_node(node->ul); + free_node(node->ur); + free_node(node->dl); + free_node(node->dr); + } + free(node); +} + +fn quadtree(usize *arr, usize size, usize n, usize lo) -> Node * { + if (n <= 2) { + let a = arr[lo]; + let b = arr[lo + 1]; + let c = arr[lo + size]; + let d = arr[lo + size + 1]; + let clk = check_all(a, b, c, d); + + Node *node = (Node *) malloc(sizeof(Node)); + if (clk) { + node->is_fb = true; + node->repr = a; + } else { + node->is_fb = false; + Node *tmp1 = (Node *) malloc(sizeof(Node)); + tmp1->is_fb = true; + tmp1->repr = a; + node->ul = tmp1; + Node *tmp2 = (Node *) malloc(sizeof(Node)); + tmp2->is_fb = true; + tmp2->repr = b; + node->ur = tmp2; + Node *tmp3 = (Node *) malloc(sizeof(Node)); + tmp3->is_fb = true; + tmp3->repr = c; + node->dl = tmp3; + Node *tmp4 = (Node *) malloc(sizeof(Node)); + tmp4->is_fb = true; + tmp4->repr = d; + node->dr = tmp4; + } + return node; + } else { + let lo_up_left = lo; + let lo_up_right = lo + n / 2; + let lo_down_left = lo + n / 2 * size; + let lo_down_right = lo + n / 2 * size + n / 2; + + let q_up_left = quadtree(arr, size, n / 2, lo_up_left); + let q_up_right = quadtree(arr, size, n / 2, lo_up_right); + let q_down_left = quadtree(arr, size, n / 2, lo_down_left); + let q_down_right = quadtree(arr, size, n / 2, lo_down_right); + + let fullbank_up_left = (q_up_left)->is_fb; + let fullbank_up_right = (q_up_right)->is_fb; + let fullbank_down_left = (q_down_left)->is_fb; + let fullbank_down_right = (q_down_right)->is_fb; + + Node *node = (Node *) malloc(sizeof(Node)); + if (fullbank_up_left && fullbank_up_left == fullbank_up_right && fullbank_up_right == fullbank_down_left && fullbank_down_left == fullbank_down_right && q_up_left->repr == q_up_right->repr && q_up_right->repr == q_down_left->repr && q_down_left->repr == q_down_right->repr) { + let repr = q_up_left->repr; + free_node(q_up_left); + free_node(q_up_right); + free_node(q_down_left); + free_node(q_down_right); + + node->is_fb = true; + node->repr = repr; + } else { + node->ul = q_up_left; + node->ur = q_up_right; + node->dl = q_down_left; + node->dr = q_down_right; + node->is_fb = false; + } + return node; + } +} + +fn main() -> int { + fastio(); + usize n; + cin >> n; + if (n == 1) { + let tmp = (usize) 0; + cin >> tmp; + cout << tmp; + return 0; + } + let arr = new usize[n * n]; + for (let i = (usize) 0; i < n * n; i++) { + char ch; + cin.get(ch); + while (ch == '\n') { + cin.get(ch); + } + arr[i] = ch - '0'; + } + + Node *node = quadtree(arr, n, n, 0); + delete[] arr; + print_node(node); + free_node(node); + return 0; +} \ No newline at end of file