QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#690996#7895. Graph Partitioning 2TomorrowTL 758ms114444kbC++173.5kb2024-10-31 09:18:412024-10-31 09:20:30

Judging History

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

  • [2024-10-31 09:20:30]
  • 评测
  • 测评结果:TL
  • 用时:758ms
  • 内存:114444kb
  • [2024-10-31 09:18:41]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

#define C const
#define U unsigned
#define SC static
#define CE constexpr
#define TL template
#define TN typename
#define OP operator
#define pb push_back
#define ft first
#define sd second
#define mi (l + (r - l) / 2)
#define TTT TL<TN T = I>
#define BE(v) v.begin(), v.end()
#define VD void
#define I int
#define LL long long
#define STR string
using PII = pair<I, I>;
TTT using V = vector<T>;

#define FORX(v) for(auto& x : v)
#define FORV(v, i) for (I i = 0, _n = v.size(), x = _n ? v[0] : 0;i < _n;x = v[++i])
#define FOR(i, b, e)  for(auto i = b, _e = (decltype(i))e;i != _e; ++i)
#define FORR(i, b, e) for(auto i = b, _e = (decltype(i))e;i != _e; --i)
#define FUNC(T, f, ...) function<T(__VA_ARGS__)> f = [&](__VA_ARGS__)->T

TTT CE T inf() { return numeric_limits<T>::max() / 2; }
TTT VD setmin(T& a, C T& b) { if (b < a)a = b; }
TTT VD setmax(T& a, C T& b) { if (a < b)a = b; }
TTT VD fastpow(T& a, T b, LL i) { for (;i;i >>= 1, b *= b)if (i & 1)a *= b; }

#define OPD(T,S,op,...) \
T& OP op##= (C S& _){{__VA_ARGS__} return *this;}\
friend T OP op (C T& a, C S& b) {T c = a; return c op##= b;}
#define OPB(T,op,...) friend bool OP op (C T& a, C T& b) {return __VA_ARGS__;}
#define OST(T) friend ostream& OP << (ostream & os, C T & a) { return os << a.x; }
struct Mod//WARNING : Mod MUST BE assigned in [0,m) unless using cc
{
	SC U I m; SC U LL i;
	SC VD set(U I mod) { m = mod, i = (U LL)(-1) / m + 1; }
	SC U I mul(U I a, U I b)
	{
		U LL x = (U LL)a * b, y = ((U __int128)x * i >> 64) * m;
		return x - y + (x < y ? m : 0);
	}
	U I x; CE Mod() :x(0) {}
	TTT CE Mod(T x) : x(x) {}
	TTT CE SC Mod cc(T x) { return (x % m + m) % m; }
	OPD(Mod, Mod, +, if ((x += _.x) >= m)x -= m;);
	OPD(Mod, Mod, -, if ((x += m - _.x) >= m)x -= m;);
	OPD(Mod, Mod, *, x = mul(x, _.x););
	OPD(Mod, Mod, / , fastpow(*this, _, m - 2););//m must be a prime
	OPD(Mod, I, ^, fastpow(*this, *this, _ - 1 + (_ > 0 ? 0 : m - 1)););
	OPB(Mod, == , a.x == b.x);
	OPB(Mod, != , a.x != b.x);
	OST(Mod)
};
U I Mod::m; U LL Mod::i;

using UM = unordered_map<I, Mod>;

I n, k;
V<V<I>> e;

VD dfs(V<UM>& f, I p, I fa)
{
	f[p][1] = 1;

	FORX(e[p])
	{
		if (x == fa)continue;
		dfs(f, x, p);

		UM fp;
		for (auto& p1 : f[p])
		{
			for (auto& p2 : f[x])
			{
				if (p1.ft + p2.ft <= k + 1)fp[p1.ft + p2.ft] += p1.sd * p2.sd;
				if (p2.ft >= k) fp[p1.ft] += p1.sd * p2.sd;
			}
		}

		f[p] = move(fp);
	}
}

V<I> sz;
V<Mod> fp;
VD dfs(V<V<Mod>>& f, I p, I fa)
{
	f[p][1] = 1; sz[p] = 1;

	FORX(e[p])
	{
		if (x == fa)continue;
		dfs(f, x, p); sz[p] += sz[x];

		fp.assign(k + 2, 0);
		FOR(i, 0, min(k + 1, sz[p]) + 1)
		{
			FOR(j, 0, sz[x] + 1)
			{
				if (i + j > k + 1)break;
				fp[i + j] += f[p][i] * f[x][j];
			}
			fp[i] += f[p][i] * (f[x][k] + f[x][k + 1]);
		}

		f[p] = fp;
	}
}

VD test()
{
	Mod::set(998244353);
	cin >> n >> k;
	e.clear();
	e.resize(n + 1);
	sz.resize(n + 1);

	FOR(i, 1, n)
	{
		I u, v; cin >> u >> v;
		e[u].pb(v), e[v].pb(u);
	}

	if (k * k < n)
	{
		V<V<Mod>> f(n + 1, V<Mod>(k + 2));
		dfs(f, 1, 0);
		cout << f[1][k] + f[1][k + 1] << '\n';
	}
	else
	{
		
		V<UM> f(n + 1);
		dfs(f, 1, 0);
		cout << f[1][k] + f[1][k + 1] << '\n';
	}

}

I main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	if (fopen("test.in", "r"))
	{
		freopen("test.in", "r", stdin);
		freopen("test.out", "w", stdout);
	}
	I t = 1;
	cin >> t;
	while (t--)test();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 43ms
memory: 4248kb

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: 758ms
memory: 114444kb

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: 281ms
memory: 29800kb

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: 262ms
memory: 29476kb

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

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:


result: