QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#693887#7895. Graph Partitioning 2AlphaZeWA 25ms6068kbC++203.0kb2024-10-31 16:55:072024-10-31 16:55:14

Judging History

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

  • [2024-10-31 16:55:14]
  • 评测
  • 测评结果:WA
  • 用时:25ms
  • 内存:6068kb
  • [2024-10-31 16:55:07]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

inline int read() {
    int x = 0, f = 0; char ch = getchar();
    while (!isdigit(ch)) f = ch == '-', ch = getchar();
    while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
    return f ? -x : x;
}

const int N = 1e5 + 10, mod = 998244353;
void AddMod(int &p, int k) { p = (p + k) % mod; }
int n, K, M = 340;
int f[N][345], siz[N], tmp[345];
vector<int> g[N];

void dfs1(int x, int father) {
    siz[x] = 1;
    f[x][1] = 1;
    for (auto y : g[x]) {
        if (y == father) continue;
        dfs1(y, x);
        for (int i = 1; i <= K + 1; ++i) tmp[i] = 0;
        for (int i = 1; i <= min(siz[x], K + 1); ++i) {
            for (int j = 1; j <= min(siz[y], K + 1) && i + j <= K + 1; ++j) {
                AddMod(tmp[i + j], 1ll * f[x][i] * f[y][j] % mod);
            }
        }
        
        for (int i = 1; i <= min(siz[x], K + 1); ++i) {
            AddMod(tmp[i], 1ll * f[x][i] * f[y][K] % mod);
            AddMod(tmp[i], 1ll * f[x][i] * f[y][K + 1] % mod);
        }
        for (int i = 1; i <= K + 1; ++i) f[x][i] = tmp[i];
        siz[x] += siz[y];
    }
}

void dfs2(int x, int father) {
    siz[x] = 1;
    f[x][0] = 1;
    for (auto y : g[x]) {
        if (y == father) continue;
        dfs2(y, x);
        for (int i = 0; i <= n / K; ++i) tmp[i] = 0;
        for (int i = 0; i <= siz[x] / K; ++i) {
            for (int j = 0; j <= siz[y] / K; ++j) {
                int lax = (siz[x] - i * K) % (K + 1);
                int lay = (siz[y] - j * K) % (K + 1);
                if (lax + lay <= K + 1) {
                    AddMod(tmp[i + j], 1ll * f[x][i] * f[y][j] % mod);
                }
                if (lay == K) {
                    AddMod(tmp[i + j + 1], 1ll * f[x][i] * f[y][j] % mod);
                } 
            }
        }      
//        printf("x = %d, y = %d; \n", x, y);
        for (int i = 0; i <= n / K; ++i) {
            f[x][i] = tmp[i];
//             printf("f[%d][%d] = %d; \n", x, i, f[x][i]);
        }
        siz[x] += siz[y];
    }
}

void solve1() {
    dfs1(1, 0);
    int ans = (f[1][K] + f[1][K + 1]) % mod;
    printf("%d\n", ans);
    for (int i = 1; i <= n; ++i) {
        for (int k = 0; k <= K + 1; ++k) {
            f[i][k] = 0;
        }
    }
}

void solve2() {
    dfs2(1, 0);
    int ans = 0;
    for (int i = 0; i <= n / K; ++i) {
        int la = (n - i * K) % (K + 1);
        if ((!la) || la == K) AddMod(ans, f[1][i]);  
    }
	for (int i = 1; i <= n; ++i) {
		for (int k = 0; k <= n / K; ++k) {
			f[i][k] = 0;
		}
	}
    printf("%d\n", ans);
}

void work() {
    n = read(); K = read();
    for (int i = 1; i < n; ++i) {
        int u = read(), v = read();
        g[u].push_back(v); g[v].push_back(u);
    }
//	if (K <= M) 
		solve1();
//	else 
//        solve2();
    for (int i = 1; i <= n; ++i) g[i].clear();
}

signed main() {
    int Tt = read();
    while (Tt--) work();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 25ms
memory: 6068kb

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
112
0
1
0
1
0
0
0
1
0
1
0
0
1
0
140
0
0
0
814
1
6
1
1
2
2
0
612
0
1
0
0
0
1
1
0
0
121
4536
0
0
1718
0
0
1
0
444
1
1908
1813
3
74
0
1
0
46
0
0
0
0
0
0
0
0
0
1
0
1
1
1
239
0
0
0
1
0
0
0
1
0
1
0
0
1
1
0
0
0
1
0
0
0
48
0
2
0
0
0
1
364
0
206
0
0
76
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
...

result:

wrong answer 5509th lines differ - expected: '1', found: '0'