101 lines
2.9 KiB
C++
101 lines
2.9 KiB
C++
#include <stdio.h>
|
|
#include <vector>
|
|
#define DEAD false
|
|
#define ALIVE true
|
|
// 'Natural count' is the name of the node when all the nodes in the tree is
|
|
// alive. xxx_num denotes the count as the question described.
|
|
|
|
int ans[200] = {0};
|
|
long long dead_nodes_num[105] = {0};
|
|
int total_dead_nodes = 0;
|
|
long long target_nodes_num[105] = {0};
|
|
int total_target_nodes = 0;
|
|
long long max_spawned_num = 0;
|
|
|
|
struct Layer {
|
|
long long start_num;
|
|
long long end_num;
|
|
std::vector<long long> dead_nodes;
|
|
};
|
|
|
|
Layer tree[150] = {0};
|
|
|
|
void create_tree(long long start_num, long long prev_alive, int layer, int next_dead_node_ptr) {
|
|
tree[layer].start_num = start_num;
|
|
prev_alive *= 2;
|
|
tree[layer].end_num = start_num + prev_alive - 1;
|
|
while (next_dead_node_ptr < total_dead_nodes &&
|
|
dead_nodes_num[next_dead_node_ptr] <= tree[layer].end_num) {
|
|
tree[layer].dead_nodes.push_back(dead_nodes_num[next_dead_node_ptr++]);
|
|
prev_alive--;
|
|
}
|
|
if (prev_alive == 0 || tree[layer].end_num >= target_nodes_num[total_target_nodes - 1]) {
|
|
max_spawned_num = tree[layer].end_num;
|
|
return;
|
|
}
|
|
|
|
create_tree(tree[layer].end_num + 1, prev_alive, layer + 1, next_dead_node_ptr);
|
|
}
|
|
|
|
void find_ans(long long target, int layer) {
|
|
ans[layer] = target;
|
|
if (layer == 1) {
|
|
return;
|
|
}
|
|
long long count_in_layer = (target - tree[layer].start_num) / 2;
|
|
for (int i = 0; i < tree[layer - 1].dead_nodes.size(); i++) {
|
|
if (count_in_layer < tree[layer - 1].dead_nodes[i] - tree[layer - 1].start_num - i) {
|
|
find_ans(tree[layer - 1].start_num + i + count_in_layer, layer - 1);
|
|
return;
|
|
}
|
|
}
|
|
// til the end_num
|
|
find_ans(tree[layer - 1].start_num + tree[layer - 1].dead_nodes.size() + count_in_layer,
|
|
layer - 1);
|
|
}
|
|
|
|
int main() {
|
|
scanf("%d %d", &total_dead_nodes, &total_target_nodes);
|
|
for (int i = 0; i < total_dead_nodes; i++) {
|
|
scanf("%lld", &dead_nodes_num[i]);
|
|
}
|
|
for (int i = 0; i < total_target_nodes; i++) {
|
|
scanf("%lld", &target_nodes_num[i]);
|
|
}
|
|
|
|
tree[1].start_num = 1;
|
|
tree[1].end_num = 1;
|
|
if (dead_nodes_num[0] == 1) {
|
|
for (int i = 0; i < total_target_nodes; i++) {
|
|
if (target_nodes_num[i] == 1) {
|
|
printf("1\n"); //
|
|
}
|
|
else {
|
|
printf("0\n");
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
create_tree(2, 1, 2, 0);
|
|
|
|
// printf("Max spawn: %lld\n", max_spawned_num);
|
|
|
|
for (int i = 0; i < total_target_nodes; i++) {
|
|
if (target_nodes_num[i] > max_spawned_num) {
|
|
printf("0\n");
|
|
continue;
|
|
}
|
|
int layer_pos = 1;
|
|
while (tree[layer_pos].end_num < target_nodes_num[i]) {
|
|
layer_pos++;
|
|
}
|
|
find_ans(target_nodes_num[i], layer_pos);
|
|
for (int j = 1; j <= layer_pos; j++) {
|
|
printf("%lld ", ans[j]);
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
return 0;
|
|
} |