QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#242885#7338. Education NightmarePetroTarnavskyi#AC ✓859ms32352kbC++201.7kb2023-11-07 18:05:382023-11-07 18:05:39

Judging History

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

  • [2023-11-07 18:05:39]
  • 评测
  • 测评结果:AC
  • 用时:859ms
  • 内存:32352kb
  • [2023-11-07 18:05:38]
  • 提交

answer

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

#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define RFOR(i, b, a) for(int i = (b) - 1; i >= (a); i--)
#define SZ(a) (int)a.size()
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second

typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef double db;

const int N = 1 << 18;

int n, s, m;
VI g[N];
int sz[N], d[N], h[N];
bool isAnc[N];
int sum[N], mx[N];
int ans;

void dfs1(int v, int p)
{
	sz[v] = 1;
	h[v] = 1;
	isAnc[v] = v == m;
	for (int to : g[v])
	{
		if (to == p)
			continue;
		d[to] = d[v] + 1;
		dfs1(to, v);
		sz[v] += sz[to];
		h[v] = max(h[v], h[to] + 1);
		isAnc[v] |= isAnc[to];
	}
}

void dfs2(int v, int p)
{
	int son = -1;
	int ss = 0;
	for (int to : g[v])
	{
		if (to == p)
			continue;
		if (isAnc[to])
			son = to;
		else
		{
			ss += 2 * sz[to];
			mx[v] = max(mx[v], h[to] + d[m] - d[v]);
		}
	}
	if (son != -1)
	{
		sum[son] = sum[v] + ss + 1;
		dfs2(son, v);
		mx[v] = max(mx[v], mx[son]);
	}
	ans = min(ans, sum[v] + d[m] - d[v] + mx[v]);
}

void solve()
{
	cin >> n >> s >> m;
	s--;
	m--;
	FOR(i, 0, n - 1)
	{
		int u, v;
		cin >> u >> v;
		u--;
		v--;
		g[u].PB(v);
		g[v].PB(u);
	}
	d[s] = 0;
	dfs1(s, -1);
	ans = 4 * n;
	dfs2(s, -1);
	if (s == m)
		cout << h[s] - 1 << "\n";
	else
		cout << ans << "\n";
	FOR(i, 0, n)
	{
		g[i].clear();
		sum[i] = 0;
		mx[i] = 0;
	}
}

int main()
{
    ios::sync_with_stdio(0); 
    cin.tie(0);
	cout << fixed << setprecision(15);
	int t;
	cin >> t;
	while (t--)
		solve();
	return 0;
}

詳細信息

Test #1:

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

input:

1
4 2 3
1 2
1 3
1 4

output:

4

result:

ok 1 number(s): "4"

Test #2:

score: 0
Accepted
time: 859ms
memory: 32352kb

input:

14966
15 13 8
7 14
7 10
5 3
1 3
15 3
1 13
9 5
7 2
6 13
10 11
13 8
5 10
5 12
14 4
16 14 9
16 11
14 9
8 15
14 15
13 10
6 11
3 2
9 5
6 7
10 6
6 8
1 5
15 4
10 2
11 12
100 49 58
67 43
55 34
84 42
3 74
84 54
20 6
86 83
88 51
2 99
4 78
91 64
14 59
82 38
91 44
24 12
12 2
39 19
43 46
5 80
41 35
80 97
79 8
47...

output:

9
8
63
12
3
9
131
8
119
10
13
95
7
76
121
4
85
2
111
7
121
132
107
69
7
117
0
96
91
6
108
90
7
9
4
97
70
94
13
3
3
10
10
12
8
5
103
115
90
5
84
130
3
6
1
114
11
137
84
4
1
132
99
8
1
3
4
13
5
88
104
123
82
5
9
127
85
12
86
11
5
4
8
5
9
4
9
64
8
105
68
2
124
83
1
108
2
1
9
78
6
121
9
0
9
13
87
0
4
9
...

result:

ok 14966 numbers