QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#367981#7895. Graph Partitioning 2ucup-team1001WA 43ms4204kbC++233.1kb2024-03-26 17:52:212024-03-26 17:52:21

Judging History

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

  • [2024-03-26 17:52:21]
  • 评测
  • 测评结果:WA
  • 用时:43ms
  • 内存:4204kb
  • [2024-03-26 17:52:21]
  • 提交

answer

#include "bits/stdc++.h"

using namespace std;

#ifndef ONLINE_JUDGE
#include "test.h"
#include "dbg.h"
#else
#define debug(...) 42
#define debug_assert(...) 42
#endif


#define IOS ios::sync_with_stdio(0),cin.tie(0)

using ll = long long;
using ull = unsigned long long;

#define endl '\n'
#define int ll

using VI = vector<int>;
using VII = vector<VI>;
using PII = pair<int, int>;
const int inf = 1e18;
const int mod = 998244353;

void init() {
}


void solve() {
    int n, k;
    cin >> n >> k;
    vector<int> ys(k + 10), nex(k + 10), val(k + 10);
    VII mp(n + 1);
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        mp[u].emplace_back(v);
        mp[v].emplace_back(u);
    }
    function<vector<pair<int,int>>(int,int)> dfs = [&](int f,int l) {
        vector<PII> dp = {{1, 1}};
        int len = 0;
        for (auto i: mp[l]) {
            if (i == f)continue;
            auto ans = dfs(l, i);
            for (auto [l1,v1]: dp) {
                for (auto [l2,v2]: ans) {
                    if (l1 + l2 <= k + 1) {
                        if (!ys[l1 + l2]) {
                            ys[l1 + l2] = len;
                            nex[len] = l1 + l2;
                            len++;
                        }
                        val[ys[l1 + l2]] = (val[ys[l1 + l2]] + (v1 * v2) % mod) % mod;
                    }
                }
            }
            vector<PII> mdp;
            for (int j = 0; j < len; j++) {
                mdp.emplace_back(nex[j], val[j]);
                val[j] = 0;
                ys[nex[j]] = 0;
                nex[j] = 0;
            }
            len = 0;
            dp = mdp;
            debug(l, i, dp);
        }
        int n0 = -1, nk = -1, nkk = -1;
        for (int i = 0; i < dp.size(); i++) {
            if (dp[i].first == 0) {
                n0 = i;
            }
            else if (dp[i].first == k) {
                nk = i;
            }
            else if (dp[i].first == k + 1) {
                nkk = i;
            }
        }
        if (nk != -1 || nkk != -1) {
            if (n0 == -1) {
                dp.emplace_back(0, 0);
                n0 = dp.size() - 1;
            }
            if (nkk != -1) {
                debug(1);
                cerr << dp[nkk].second << endl;
            }
            dp[n0].second = (dp[n0].second + ((nk == -1)
                                                  ? 0ll
                                                  : dp[nk].second) +
                             ((nkk == -1)
                                  ? 0ll
                                  : dp[nkk].second));
        }
        if (nkk != -1) {
            swap(dp[nkk], dp.back());
            dp.pop_back();
        }
        return dp;
    };
    auto ans = dfs(0, 1);
    debug(ans);
    for (auto [i,j]: ans) {
        if (i == 0) {
            cout << j << endl;
            return;
        }
    }
    cout << 0 << endl;
}

signed main() {
    IOS;
    init();
    // debug(1);
    int t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3496kb

input:

2
8 2
1 2
3 1
4 6
3 5
2 4
8 5
5 7
4 3
1 2
1 3
2 4

output:

2
1

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 43ms
memory: 4204kb

input:

5550
13 4
10 3
9 1
10 8
3 11
8 5
10 7
9 6
13 5
9 7
2 7
5 12
4 8
8 2
4 1
3 4
7 8
2 5
6 7
4 8
2 3
11 1
11 10
1 4
9 10
8 4
3 6
5 7
6 1
10 2
11 7
11 1
17 2
14 16
13 15
17 3
15 11
1 6
13 2
13 17
4 8
14 10
8 14
14 5
9 12
14 2
12 17
17 6
15 7
14 6
2 14
2 13
2 4
8 4
3 11
7 3
14 1
11 9
13 3
5 10
6 8
3 10
14 ...

output:

0
3
64
0
1
0
1
0
0
0
1
0
1
0
0
1
0
84
0
0
0
150
1
6
1
1
2
2
0
171
0
1
0
0
0
1
1
0
0
35
900
0
0
561
0
0
1
0
144
1
852
400
3
28
0
1
0
24
0
0
0
0
0
0
0
0
0
1
0
1
1
1
99
0
0
0
1
0
0
0
1
0
1
0
0
1
1
0
0
0
1
0
0
0
40
0
2
0
0
0
1
171
0
81
0
0
44
0
1
0
0
2
0
1
2
0
0
1
0
0
4
0
1
1
0
0
1
1
1
0
0
1
1
1
1
1
0
3...

result:

wrong answer 3rd lines differ - expected: '112', found: '64'