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 |
|
|
| 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 |