QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#649584#7895. Graph Partitioning 2tumu1tTL 2120ms453728kbC++235.6kb2024-10-18 02:45:482024-10-18 02:45:48

Judging History

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

  • [2024-10-18 02:45:48]
  • 评测
  • 测评结果:TL
  • 用时:2120ms
  • 内存:453728kb
  • [2024-10-18 02:45:48]
  • 提交

answer

#include <bits/stdc++.h>
typedef long long LL;
using std::cin, std::cout, std::endl, std::vector, std::pair;

template <typename T>
constexpr T power(T a, long long b)
{
    T res = 1;
    for (; b; b >>= 1, a *= a)
        if (b & 1)
            res *= a;
    return res;
}
template <int P>
class Mint
{
public:
    int x;
    static int MOD;
    constexpr Mint() : x() {}
    constexpr Mint(long long _x) : x{norm(_x % getMOD())} {}

    constexpr static void setMOD(int _MOD) { MOD = _MOD; }
    constexpr static int getMOD() { return P > 0 ? P : MOD; }
    constexpr int norm(int x) const { return x >= 0 && x < getMOD() ? x : (x < 0 ? x += getMOD() : x -= getMOD()); }
    constexpr int val() const { return x; }
    explicit constexpr operator int() const { return x; }
    constexpr Mint operator-() const
    {
        Mint res;
        res.x = norm(getMOD() - x);
        return res;
    }
    constexpr Mint inv() const
    {
        assert(x != 0);
        return power(*this, getMOD() - 2);
    }
    constexpr Mint &operator*=(Mint rhs) &
    {
        x = 1LL * x * rhs.x % getMOD();
        return *this;
    }
    constexpr Mint &operator+=(Mint rhs) &
    {
        x = norm(x + rhs.x);
        return *this;
    }
    constexpr Mint &operator-=(Mint rhs) &
    {
        x = norm(x - rhs.x);
        return *this;
    }
    constexpr Mint &operator/=(Mint rhs) & { return *this *= rhs.inv(); }
    friend constexpr Mint operator*(Mint lhs, Mint rhs)
    {
        Mint res = lhs;
        res *= rhs;
        return res;
    }
    friend constexpr Mint operator+(Mint lhs, Mint rhs)
    {
        Mint res = lhs;
        res += rhs;
        return res;
    }
    friend constexpr Mint operator-(Mint lhs, Mint rhs)
    {
        Mint res = lhs;
        res -= rhs;
        return res;
    }
    friend constexpr Mint operator/(Mint lhs, Mint rhs)
    {
        Mint res = lhs;
        res /= rhs;
        return res;
    }
    friend constexpr std::istream &operator>>(std::istream &is, Mint &a)
    {
        long long v;
        is >> v;
        a = Mint(v);
        return is;
    }
    friend constexpr std::ostream &operator<<(std::ostream &os, const Mint &a) { return os << a.val(); }
    friend constexpr bool operator==(Mint lhs, Mint rhs) { return lhs.val() == rhs.val(); }
    friend constexpr bool operator!=(Mint lhs, Mint rhs) { return lhs.val() != rhs.val(); }
};

template <>
int Mint<0>::MOD = 998'244'353;

template <int V, int P>
constexpr Mint<P> Cinv = Mint<P>(V).inv();

constexpr int P = 998'244'353; // 可以修改这里的P 如果需要将变量设为P,需要将P变为0
using Z = Mint<P>;

// 998'244'353


void Solve1(int n, int k)
{
    vector<vector<int>> G(n);
    for (int i = 1; i <= n - 1; i++)
    {
        int x, y;
        cin >> x >> y;
        x -= 1;
        y -= 1;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    auto Dfs = [&](auto self, int at, int from) -> pair<int, vector<Z>>
    {
        vector<Z> Ans(2);
        Ans[1] = 1;
        int subTree = 1;
        for (auto &v : G[at])
        {
            if (v == from)
                continue;
            else
            {
                const auto &[sz, SonAns] = self(self, v, at);
                vector<Z> newAns(std::min<int>(subTree + sz, k + 1) + 1);
                for (int i = 1; i < (int)Ans.size(); i++)
                {
                    for (int j = 0; j < (int)SonAns.size() && i + j < (int)newAns.size(); j++)
                    {
                        newAns[i + j] += SonAns[j] * Ans[i];
                    }
                }
                Ans = std::move(newAns);
                subTree += sz;
            }
        }
        if ((int)Ans.size() >= k + 2)
            Ans[0] += Ans[k + 1];
        if ((int)Ans.size() >= k + 1)
            Ans[0] += Ans[k];
        return {subTree, Ans};
    };

    cout << Dfs(Dfs, 0, -1).second[0] << endl;
}

void Solve2(int n, int k)
{
    vector<vector<int>> G(n);
    for (int i = 1; i <= n - 1; i++)
    {
        int x, y;
        cin >> x >> y;
        x -= 1;
        y -= 1;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    vector<std::map<int, Z>> Dp(n);
    auto Dfs = [&](auto self, int at, int from) -> int
    {
        std::map<int, Z> Ans;
        Ans[1] = 1;
        int subTree = 1;
        for (auto &v : G[at])
        {
            if (v == from)
                continue;
            else
            {
                int sz = self(self, v, at);
                subTree += sz;
                std::map<int, Z> newAns;
                for (auto &[i, d1] : Ans)
                {
                    for (auto &[j, d2] : Dp[v])
                    {
                        if (i + j > k + 1)
                            break;
                        newAns[i + j] += d1 * d2;
                    }
                }
                Ans = std::move(newAns);
            }
        }
        if (auto it = Ans.find(k); it != Ans.end())
            Ans[0] += Ans[k];
        if (auto it = Ans.find(k + 1); it != Ans.end())
            Ans[0] += Ans[k + 1];
        Dp[at] = std::move(Ans);
        return subTree;
    };
    Dfs(Dfs, 0, -1);
    cout << Dp[0][0] << endl;
}

void Solve(int t)
{
    int n, k;
    cin >> n >> k;
    if (k * k < n)
        Solve1(n, k);
    else
        Solve2(n, k);
    return;
}

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

    int testcases = 1;
    cin >> testcases;
    for (int i = 1; i <= testcases; i++)
        Solve(i);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 0
Accepted
time: 31ms
memory: 4380kb

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:

ok 5550 lines

Test #3:

score: 0
Accepted
time: 194ms
memory: 9272kb

input:

3
99990 259
23374 69108
82204 51691
8142 67119
48537 97966
51333 44408
33147 68485
21698 86824
15746 58746
78761 86975
58449 61819
69001 68714
25787 2257
25378 14067
64899 68906
29853 31359
75920 85420
76072 11728
63836 55505
43671 98920
77281 25176
40936 66517
61029 61440
66908 52300
92101 59742
69...

output:

259200
247
207766300

result:

ok 3 lines

Test #4:

score: 0
Accepted
time: 137ms
memory: 18684kb

input:

3
99822 332
11587 83046
63424 60675
63423 73718
74622 40130
5110 26562
28361 80899
30886 70318
8708 11068
34855 96504
7904 75735
31904 42745
87892 55105
82374 81319
77407 82147
91475 12343
13470 95329
58766 95716
83232 44156
75907 92437
69785 93598
47857 33018
62668 31394
24238 72675
98254 43583
180...

output:

315881300
4505040
185631154

result:

ok 3 lines

Test #5:

score: 0
Accepted
time: 130ms
memory: 18580kb

input:

3
99021 1000
41739 4318
72541 76341
31227 15416
49232 13808
50837 51259
74464 11157
92684 84646
95226 64673
74155 82511
33301 31373
5901 29318
38227 98893
96752 57411
35167 42401
24344 90803
6956 33753
51120 24535
29594 2646
70305 32961
93079 38070
49273 48987
62799 77986
94353 84447
74970 31546
263...

output:

917568
1
1213

result:

ok 3 lines

Test #6:

score: 0
Accepted
time: 1777ms
memory: 18308kb

input:

3
100000 10000
15556 26349
14984 68012
43040 63434
32168 60646
70509 38559
26238 29031
45952 19431
29510 54395
5676 59515
28220 41438
46902 56640
8221 80059
77225 66558
17473 87324
20819 35098
29515 12641
84108 41157
11223 66562
25999 95852
3790 63605
20963 15799
217 58841
61619 13324
3406 60525
693...

output:

1
1
1

result:

ok 3 lines

Test #7:

score: 0
Accepted
time: 184ms
memory: 30920kb

input:

3
99969 79
84806 29026
76190 49303
81448 88606
47775 83229
7424 30063
75504 59640
28456 18012
26623 18383
66305 32640
55981 65140
25760 523
76248 13482
25598 55231
96844 17032
44892 64592
4915 50521
49879 86466
99286 20894
97915 76337
38424 2546
17489 46475
91791 2636
79283 35209
14773 60224
94096 5...

output:

855988479
413863362
390147247

result:

ok 3 lines

Test #8:

score: 0
Accepted
time: 2120ms
memory: 453728kb

input:

3
99655 347
11149 99084
14300 87239
74978 75669
48703 12705
62600 62372
85743 67544
11248 36566
31920 23357
91970 67460
47599 56467
67521 16526
50284 63800
6701 3456
15660 81507
43192 5734
57965 67731
42676 26195
60309 19848
30504 47635
66455 98017
1645 70119
47861 95592
32453 39251
31178 59516
2144...

output:

500906609
4366296
91620762

result:

ok 3 lines

Test #9:

score: 0
Accepted
time: 761ms
memory: 154500kb

input:

3
99074 1000
10018 10926
93276 10882
57018 36456
36298 20551
34971 14671
82296 41279
49459 20897
56874 98633
57849 24888
15425 8116
62887 30467
61380 38308
70548 49238
49287 13456
83286 31072
93096 52396
17509 64864
75106 13508
26188 61092
74762 46749
78773 89071
57494 24130
29618 24192
21061 11372
...

output:

895874645
85900584
237336

result:

ok 3 lines

Test #10:

score: -100
Time Limit Exceeded

input:

3
90006 10000
73490 30293
71611 45400
5985 73192
89192 86831
26722 13580
73 42029
64900 69699
1501 9326
5417 72489
81756 62830
19449 20243
85297 63347
30952 20243
69122 148
42880 88227
69343 66867
72919 75705
53663 32672
65715 35962
19421 5905
13102 4284
40894 88911
87558 21940
82573 82415
83203 131...

output:

84
3

result: