QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#622030#7895. Graph Partitioning 2DoubeecatTL 3ms13444kbC++232.4kb2024-10-08 19:34:072024-10-08 19:34:07

Judging History

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

  • [2024-10-08 19:34:07]
  • 评测
  • 测评结果:TL
  • 用时:3ms
  • 内存:13444kb
  • [2024-10-08 19:34:07]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair <int,int>
const int N = 1e5 + 10;
const int K = 320;
const ll mod = 998244353;
unordered_map <int,int> DP[N],ttmp;
ll dp[N][K],n,k,tmp[N],siz[N];
vector <int> G[N];

void dfs1(int x,int fa) {
    dp[x][1] = 1;
    siz[x] = 1;
    for (auto y : G[x]) {
        if (y == fa) continue;
        dfs1(y,x);
        for (int i = 0;i <= k+1;++i) tmp[i] = 0;
        for (int j = 0;j <= min(siz[y],k);++j) {//这一步的上界为k,因为i要占用1个点
            for (int i = min(k+1 - j,siz[x]);i >= 1;--i) {
                tmp[i+j] = (tmp[i+j] + dp[x][i] * dp[y][j] % mod) % mod;
            }
        }
        siz[x] += siz[y];
        for (int i = 0;i <= k+1;++i) dp[x][i] = tmp[i];
    }
    dp[x][0] = (dp[x][k] + dp[x][k+1]) % mod;
    /*cout << "nowpoi:" << x << "\n";
    for (int i = 0;i <= k+1;++i) {
        cout << dp[x][i] << " ";
    }
    cout <<"\n";*/
}

void dfs2(int x,int fa) {
    DP[x][1] = 1;
    siz[x] = 1;
    for (auto y : G[x]) {
        if (y == fa) continue;
        dfs2(y,x);
        ttmp.clear();
        for (auto [j,val2] : DP[y]) {
            for (auto [i,val1] : DP[x]) {
                if (i + j > k+1) continue;
                ttmp[i+j] = (ttmp[i+j] + val1 * val2 % mod) % mod;
            }
        }
        DP[x].clear();
        for (auto [i,val1] : ttmp) DP[x][i] = val1;
        siz[x] += siz[y];
    }
    ll now = 0;
    if (DP[x].count(k)) now += DP[x][k];
    if (DP[x].count(k+1)) now += DP[x][k+1];
    DP[x][0] = (now % mod + mod )% mod;
    /*cout << "nowpoi:" << x <<"\n";
    for (auto [i,j] : DP[x]) {
        cout << i << " " << j << "\n";
    }
    cout <<"\n";*/

}

void solve() {
    cin >> n >> k;
    for (int i = 1;i <= n;++i) G[i].clear();
    for (int i = 1;i < n;++i) {
        int x,y;cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    int lim = sqrt(n);
    if (k <= lim) {
        for (int i = 1;i <= n;++i) {
            for (int j = 0;j <= k;++j) {
                dp[i][j] = 0;
            }
        }
        dfs1(1,0);
        cout << dp[1][0] << "\n";
    } else {
        DP[1].clear();
        dfs2(1,0);
        cout << DP[1][0] << "\n";
    }
}

signed main() {
    ios::sync_with_stdio(false);
    int T;cin >> T;
    while (T--) solve();
    return 0;
}
/*
2
4 3
1 2
1 3
2 4
4 3
1 2
1 3
2 4
*/

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 13444kb

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
Time Limit Exceeded

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
192
0
16
3
1
0
31493
556962307
1
328067808
914352427
569851081
298415738
171161593
4
393
205062569
0
96551519
2384
723817520
10
6
661195465
2
521549635
783009006
1620
78321769
914751372
164028453
101241628
591838220
409478463
129213987
0
241302935
709
174936389
8
32806460
11403
0
797053439
62404...

result: