QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#698385#7895. Graph Partitioning 2test_algthWA 38ms13684kbC++142.2kb2024-11-01 19:16:442024-11-01 19:16:44

Judging History

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

  • [2024-11-01 19:16:44]
  • 评测
  • 测评结果:WA
  • 用时:38ms
  • 内存:13684kb
  • [2024-11-01 19:16:44]
  • 提交

answer

#include <bits/stdc++.h>

const int MAXN = 1.01E5;
const int MAXB = 500;
const int P = 998244353;

inline int add(int a, int b) {
  return a -= (a += b) >= P ? P : 0;
}

inline void incr(int& a, int b) {
  a = add(a, b);
}

int dp[MAXN][MAXB + 1], sz[MAXN], ndp[MAXB + 1];
int N, K;
std::unordered_map <int, int> f[MAXN], g;
std::vector <int> adj[MAXN];

inline void merge(int u, int v) {
  for (int i = 0; i <= std::min(K + 1, sz[u] + sz[v]); ++i)
    ndp[i] = 0;
  
  for (int i = 0; i <= sz[u]; ++i) {
    for (int j = 0; j <= sz[v] && i + j <= K + 1; ++j) {
      incr(ndp[i + j], 1ll * dp[u][i] * dp[v][j] % P);
    }
    incr(ndp[i], 1ll * dp[u][i] * add(dp[v][K], dp[v][K + 1]) % P);
  }

  sz[u] += sz[v];
  for (int i = 0; i <= std::min(K + 1, sz[u]); ++i)
    dp[u][i] = ndp[i];
}

void solve(int u, int pa) {
  sz[u] = dp[u][1] = 1;
  for (int i = 2; i <= K; ++i)
    dp[u][i] = 0;
  for (int v : adj[u]) {
    if (v == pa) continue;
    solve(v, u);
    merge(u, v);
  }
}

inline void merge2(int u, int v) {
  g.clear();
  for (auto [a, b] : f[u]) {
    for (auto [c, d] : f[v]) {
      if (a + c <= K + 1) {
        incr(g[a + c], 1ll * b * d % P);
      }
    }
    
    if (f[v].count(K)) {
      incr(g[a], 1ll * b * f[v][K] % P);
    }

    if (f[v].count(K + 1)) {
      incr(g[a], 1ll * b * f[v][K + 1]);
    }
  }

  f[u] = g;
}

void solve2(int u, int pa) {
  f[u].clear();
  f[u][1] = 1;
  for (int v : adj[u]) {
    if (v == pa) continue;
    solve2(v, u);
    merge2(u, v);
  }
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  int testCase = 1;
  std::cin >> testCase;
  while (testCase--) {
    std::cin >> N >> K;
    for (int i = 1; i <= N; ++i) {
      adj[i].clear();
    }

    for (int i = 1, u, v; i < N; ++i) {
      std::cin >> u >> v;
      adj[u].push_back(v);
      adj[v].push_back(u);
    }

    if (K < MAXB) { 
      solve(1, 1);
      std::cout << add(dp[1][K], dp[1][K + 1]) << '\n';
    }
    else {
      solve2(1, 1);
      std::cout << add(f[1][K], f[1][K + 1]) << '\n';
    }
  }

  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 38ms
memory: 13684kb

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
5
512
36
1
0
1
3
0
0
1
0
1
0
0
1
0
222
0
0
0
1381
1
17
6
1
2
2
0
1044
0
1
0
0
0
1
1
0
0
344
39743328
0
0
4617
2
0
1
0
1356
1
691069
152237970
3
384
0
1
0
73
0
0
0
0
0
1
0
0
0
1
0
1
1
1
421
0
0
0
2
0
0
0
2
0
1
1
1
1
1
0
0
0
1
1
0
0
77
0
5
0
2
0
2
656
0
578
0
0
208
0
1
0
0
2
0
2
4
0
1
3
0
0
12
0
1
1...

result:

wrong answer 2nd lines differ - expected: '3', found: '5'