complete 1992.cpp

This commit is contained in:
2026-03-16 17:08:40 +09:00
parent f32860d61a
commit 701942606e

View File

@@ -0,0 +1,148 @@
#include <cstdlib>
#include <iostream>
#include <tuple>
#include <vector>
#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;
}