QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#789579 | #9806. Growing Tree | Empty_Dust | WA | 30ms | 3584kb | C++23 | 2.6kb | 2024-11-27 20:58:19 | 2024-11-27 20:58:21 |
Judging History
answer
#include <bits/stdc++.h>
#define ranges std::ranges
#define views std::views
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;
using pii = std::pair<int, int>;
using a3 = std::array<i64, 3>;
using a4 = std::array<int, 4>;
const int N = 1e6;
const int MAXN = 1e6 + 10;
const int inf = 1e9;
// const int mod = 1e9 + 7;
const int mod = 998244353;
void solve() {
int n;std::cin >> n;
int m = 1 << n + 1;
std::vector<i64> a(m), depth(m), dep(m), vis(m), cnt(n);
for (int i = 2;i < m;++i)std::cin >> a[i];
auto cal = [&](auto&& self, int u, i64 d, int dp) ->void {
depth[u] = d;
dep[u] = dp;
if ((u << 1) >= m)return;
self(self, u << 1, d + a[u << 1], dp + 1);
self(self, u << 1 | 1, d + a[u << 1 | 1], dp + 1);
};
cal(cal, 1, 0, 0);
std::vector<a3> p;
for (int i = 1 << n;i < m;++i) {
for (int j = i + 1;j < m;++j) {
if (depth[i] == depth[j]) {
p.push_back(a3{ depth[i], i, j });
}
}
}
ranges::sort(p, std::greater<>());
int T = p.size();
// std::cout << T << '\n';
// for (auto [d, x, y] : p)std::cout << d << " " << x << " " << y << '\n';
auto check = [&](int u, int v) {
while (u != v) {
if (vis[u] || vis[v])return true;
u /= 2;
v /= 2;
}
return false;
};
auto lca = [&](int u, int v) {
while (u != v) {
u /= 2;
v /= 2;
}
return u;
};
int ans = 1e9;
auto dfs = [&](auto&& self, int t, int c) {
if (ans <= c)return;
// std::cout << t << ' ' << c << "\n";
while (t < T) {
auto [d, u, v] = p[t];
if (!check(u, v))break;
t++;
}
if (t == T) {
ans = c;
return;
}
int l = lca(p[t][1], p[t][2]);
cnt[dep[l]]++;
for (int i = n - 1, sum = 0;i >= 0;--i) {
sum += cnt[i];
if (cnt[i] > n - i) {
cnt[dep[l]]--;
return;
}
}
vis[l << 1] = 1;
self(self, t, c + 1);
vis[l << 1] = 0;
vis[l << 1 | 1] = 1;
self(self, t, c + 1);
vis[l << 1 | 1] = 0;
cnt[dep[l]]--;
};
dfs(dfs, 0, 0);
if (ans == 1e9)ans = -1;
std::cout << ans << '\n';
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0), std::cout.tie(0);
int t;std::cin >> t;
while (t--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3552kb
input:
3 2 1 2 4 3 2 1 2 1 2 3 3 2 1 2 1 2 3 3 1 1
output:
1 2 -1
result:
ok 3 number(s): "1 2 -1"
Test #2:
score: -100
Wrong Answer
time: 30ms
memory: 3584kb
input:
94 5 44 65 38 61 64 94 71 53 65 10 24 36 98 74 11 4 5 46 72 34 9 24 37 32 76 29 48 88 17 14 36 4 22 6 71 53 24 61 89 79 39 57 99 61 27 85 99 46 81 75 90 25 16 13 1 87 55 81 56 78 67 2 3 83 3 74 14 45 17 22 41 62 74 25 1 56 22 7 21 73 83 99 3 91 16 53 8 10 49 29 54 81 45 10 12 68 32 9 30 11 99 85 73 ...
output:
3 0 8 2 0 1 9 0 0 4 0 0 0 1 2 1 0 2 0 1 0 -1 0 10 0 0 -1 9 12 -1 -1 5 -1 0 4 2 8 -1 -1 -1 1 2 5 0 0 3 8 1 7 0 -1 2 10 0 0 0 -1 1 13 10 0 0 1 1 8 0 1 2 0 -1 0 0 1 1 6 0 10 0 0 0 -1 3 -1 1 8 0 0 0 0 1 0 -1 3 3
result:
wrong answer 1st numbers differ - expected: '2', found: '3'