QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#789660#9806. Growing TreeEmpty_DustWA 2ms3872kbC++232.8kb2024-11-27 21:21:572024-11-27 21:22:02

Judging History

你现在查看的是最新测评结果

  • [2024-11-27 21:22:02]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:3872kb
  • [2024-11-27 21:21:57]
  • 提交

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);
    auto lcdep = [&](int u, int v) {
        while (u != v) {
            u /= 2;
            v /= 2;
        }
        return dep[u];
        };
    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{ lcdep(i,j), 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;
        while (t < T) {
            auto [d, u, v] = p[t];
            if (!check(u, v))break;
            t++;
        }
        // std::cout << t << ' ' << c << "\n";
        if (t == T) {
            ans = c;
            return;
        }
        auto [d, u, v] = p[t];

        cnt[d]++;
        for (int i = n - 1, sum = 0;i >= 0;--i) {
            sum += cnt[i];
            if (cnt[i] > n - i) {
                cnt[d]--;
                return;
            }
        }

        int l = lca(u, v);
        assert(d == dep[l]);
        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[d]--;
        };
    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: 3524kb

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: 2ms
memory: 3872kb

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:

2
0
8
2
0
1
8
0
0
3
0
0
0
1
2
1
0
2
0
1
0
-1
0
9
0
0
-1
8
10
-1
-1
4
-1
0
3
2
7
-1
-1
-1
1
2
4
0
0
2
7
1
6
0
-1
2
9
0
0
0
-1
1
12
9
0
0
1
1
7
0
1
2
0
-1
0
0
1
1
6
0
9
0
0
0
-1
3
-1
1
7
0
0
0
0
1
0
-1
3
3

result:

wrong answer 3rd numbers differ - expected: '-1', found: '8'