Submission #75925325


Source Code Expand

#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#define rep(i, s, e) for (ll i = (s); i <= (e); i++)
#define all(v) v.begin(), v.end()
#define pb push_back
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using P = array<ll, 2>;
ll n, z, p[101010], u, v, sp[202020][20], h[202020], vs[101010], res, dp[202020], sz[202020];
vector<ll> e[202020], ed[101010];
P dia[101010];
void dfs(ll x, ll f) {
	for (ll i : e[x])
		if (i ^ f)
			h[i] = h[x] + 1, sp[i][0] = x, dfs(i, x);
}
ll dist(P v) {
	auto [x, y] = v;
	ll r = 0;
	if (h[x] < h[y])
		swap(x, y);
	rep(k, 0, 19) if (h[x] - h[y] >> k & 1) x = sp[x][k], r += 1 << k;
	if (x == y)
		return r;
	for (ll k = 20; k--;)
		if (sp[x][k] != sp[y][k])
			x = sp[x][k], y = sp[y][k], r += 2 << k;
	return r + 2;
}
P mg(P a, P b) {
	P r = dist(a) > dist(b) ? a : b;
	for (ll i : a)
		for (ll j : b)
			if (dist({i, j}) > dist(r))
				r = {i, j};
	return r;
}
ll cy(ll x, ll t) {
	if (vs[x])
		return vs[x] == t;
	vs[x] = t;
	for (ll i : ed[x])
		if (cy(i, t))
			return 1;
	return 0;
}
void dc(ll x, ll f) {
	dia[x] = mg(dia[x], dia[f]);
	ll d = dist(dia[x]) / 2;
	auto [u, v] = dia[x];
	res += d;
	if (h[u] < h[v])
		swap(u, v);
	rep(k, 0, 19) if (d >> k & 1) u = sp[u][k];
	sz[u]++;
	for (ll i : ed[x])
		dc(i, x);
}
void gd(ll x, ll f) {
	for (ll i : e[x])
		if (i ^ f) {
			gd(i, x);
			dp[x] += dp[i] + sz[i], sz[x] += sz[i];
		}
}
void rrt(ll x, ll f) {
	for (ll i : e[x])
		if (i ^ f) {
			dp[i] = dp[x] + n - 2 * sz[i], sz[i] = n;
			rrt(i, x);
		}
}
int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin >> n;
	rep(i, 1, n) cin >> p[i], dia[i] = {i, i}, ed[p[i]].push_back(i);
	z = 2 * n - 1;
	rep(i, n + 1, z) {
		cin >> u >> v;
		e[u].pb(i), e[i].pb(u), e[v].pb(i), e[i].pb(v);
	}
	dfs(1, 0);
	rep(k, 1, 19) rep(i, 1, z) sp[i][k] = sp[sp[i][k - 1]][k - 1];
	rep(i, 1, n) if (cy(i, i)) {
		for (ll j = p[i]; j != i; j = p[j])
			dia[i] = mg(dia[i], dia[j]);
		ed[p[i]].erase(ranges::find(ed[p[i]], i));
		for (ll j = p[i]; j != i; j = p[j]) {
			ed[p[j]].erase(ranges::find(ed[p[j]], i));
		}
		dc(i, i);
		for (ll j = p[i]; j != i; j = p[j])
			dc(j, i);
	}
	gd(1, 0);
	rrt(1, 0);
	rep(i, 1, n) cout << (res + dp[i]) / 2 << ' ';
	return 0;
}

Submission Info

Submission Time
Task K - Cosmic Playground
User iAi
Language C++23 (GCC 15.2.0)
Score 100
Code Size 2359 Byte
Status AC
Exec Time 362 ms
Memory 63588 KiB

Compile Error

./Main.cpp: In function 'll dist(P)':
./Main.cpp:24:32: warning: suggest parentheses around '-' inside '>>' [-Wparentheses]
   24 |         rep(k, 0, 19) if (h[x] - h[y] >> k & 1) x = sp[x][k], r += 1 << k;
      |                           ~~~~~^~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 1
AC × 35
Set Name Test Cases
Sample 00-sample-001.txt
All 00-sample-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt, 01-031.txt, 01-032.txt, 01-033.txt, 01-034.txt, 01-035.txt
Case Name Status Exec Time Memory
00-sample-001.txt AC 2 ms 3616 KiB
01-002.txt AC 2 ms 3472 KiB
01-003.txt AC 2 ms 3428 KiB
01-004.txt AC 4 ms 4164 KiB
01-005.txt AC 28 ms 10532 KiB
01-006.txt AC 175 ms 40900 KiB
01-007.txt AC 300 ms 60956 KiB
01-008.txt AC 298 ms 60800 KiB
01-009.txt AC 304 ms 61728 KiB
01-010.txt AC 306 ms 60384 KiB
01-011.txt AC 308 ms 61052 KiB
01-012.txt AC 361 ms 63264 KiB
01-013.txt AC 353 ms 63108 KiB
01-014.txt AC 357 ms 62712 KiB
01-015.txt AC 341 ms 63588 KiB
01-016.txt AC 362 ms 63092 KiB
01-017.txt AC 150 ms 60684 KiB
01-018.txt AC 3 ms 4252 KiB
01-019.txt AC 11 ms 9040 KiB
01-020.txt AC 100 ms 47096 KiB
01-021.txt AC 135 ms 59360 KiB
01-022.txt AC 128 ms 59392 KiB
01-023.txt AC 125 ms 59492 KiB
01-024.txt AC 128 ms 59696 KiB
01-025.txt AC 297 ms 61872 KiB
01-026.txt AC 304 ms 61700 KiB
01-027.txt AC 299 ms 61696 KiB
01-028.txt AC 302 ms 61568 KiB
01-029.txt AC 296 ms 61584 KiB
01-030.txt AC 298 ms 61584 KiB
01-031.txt AC 236 ms 59456 KiB
01-032.txt AC 233 ms 59456 KiB
01-033.txt AC 251 ms 59696 KiB
01-034.txt AC 223 ms 59456 KiB
01-035.txt AC 247 ms 59552 KiB