QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#464502#7895. Graph Partitioning 2Andyqian7TL 0ms40144kbC++142.9kb2024-07-06 10:29:332024-07-06 10:29:34

Judging History

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

  • [2024-07-06 10:29:34]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:40144kb
  • [2024-07-06 10:29:33]
  • 提交

answer

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int MAX = 3e5 + 10, mod = 998244353;
int T, n, k, sz[MAX], cnt[MAX];
vector<int> nei[MAX], sons[MAX], dp[MAX];
map<int, int> dp2[MAX];
void getsz(int s)
{
    sz[s] = 1;
    for (int son : nei[s])
    {
        if (sz[son])
            continue;
        sons[s].pb(son);
        getsz(son);
        sz[s] += sz[son];
    }
}
void dfs(int s)
{
    dp[s].resize(2);
    dp[s][1] = 1;
    int cnt1 = 0, cnt2 = 0;
    for (int son : sons[s])
    {
        dfs(son);
        dp[s].resize(dp[s].size() + dp[son].size());
        for (int i = min(k + 1, (int)dp[s].size() - 1); i > 0; i--)
        {
            for (int j = min(k + 1, (int)dp[son].size() - 1); j > 0; j--)
            {
                if (i + j <= min(k + 1, (int)dp[s].size() - 1))
                {
                    dp[s][i + j] = (dp[s][i + j] + 1ll * dp[s][i] * dp[son][j]) % mod;
                }
            }
            dp[s][i] = 1ll * dp[s][i] * dp[son][0] % mod;
        }
    }
    if (k + 1 < dp[s].size())
        dp[s][0] = (dp[s][k] + dp[s][k + 1]) % mod;
    else if (k < dp[s].size())
    {
        dp[s][0] = dp[s][k];
    }
}
void dfs2(int s)
{
    dp2[s][1] = 1;
    int cnt1 = 0, cnt2 = 0;
    for (int son : sons[s])
    {
        dfs2(son);
        for (auto i = dp2[s].rbegin(); i != dp2[s].rend(); i++)
        {
            for (auto j = dp2[son].rbegin(); j != dp2[son].rend(); j++)
            {
                if (j->first == 0)
                    continue;
                dp2[s][i->first + j->first] = (dp2[s][i->first + j->first] + 1ll * dp2[s][i->first] * dp2[son][j->first]) % mod;
            }
            dp2[s][i->first] = 1ll * dp2[s][i->first] * dp2[son][0] % mod;
        }
    }
    if (dp2[s].count(k))
        dp2[s][0] = (dp2[s][0] + dp2[s][k]) % mod;
    if (dp2[s].count(k + 1))
        dp2[s][0] = (dp2[s][0] + dp2[s][k + 1]) % mod;
}
int main()
{
    cin >> T;
    while (T--)
    {
        cin >> n >> k;
        if (k < sqrt(n))
        {
            for (int i = 1; i <= n; i++)
            {
                sz[i] = 0;
                nei[i].clear(), sons[i].clear(), dp[i].clear();
            }
            for (int i = 0; i < n - 1; i++)
            {
                int u, v;
                cin >> u >> v;
                nei[u].pb(v), nei[v].pb(u);
            }
            getsz(1), dfs(1);
            cout << dp[1][0] << endl;
        }
        else
        {
            for (int i = 1; i <= n; i++)
            {
                sz[i] = 0;
                nei[i].clear(), sons[i].clear(), dp2[i].clear();
            }
            for (int i = 0; i < n - 1; i++)
            {
                int u, v;
                cin >> u >> v;
                nei[u].pb(v), nei[v].pb(u);
            }
            getsz(1), dfs2(1);
            cout << dp2[1][0] << endl;
        }
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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:


result: