From 8e57d3d88932e61df92c5e738e0d50511a11d49e Mon Sep 17 00:00:00 2001 From: Ukj0ng <90972240+Ukj0ng@users.noreply.github.com> Date: Sun, 12 Oct 2025 13:59:53 +0900 Subject: [PATCH] =?UTF-8?q?[20251012]=20BOJ=20/=20G2=20/=20=EB=91=90=20?= =?UTF-8?q?=EC=84=AC=EA=B0=84=EC=9D=98=20=EC=9D=B4=EB=8F=99=20/=20?= =?UTF-8?q?=ED=95=9C=EC=A2=85=EC=9A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\235\230 \354\235\264\353\217\231.md" | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 "Ukj0ng/202510/12 BOJ G2 \353\221\220 \354\204\254\352\260\204\354\235\230 \354\235\264\353\217\231.md" diff --git "a/Ukj0ng/202510/12 BOJ G2 \353\221\220 \354\204\254\352\260\204\354\235\230 \354\235\264\353\217\231.md" "b/Ukj0ng/202510/12 BOJ G2 \353\221\220 \354\204\254\352\260\204\354\235\230 \354\235\264\353\217\231.md" new file mode 100644 index 00000000..4c8bbda9 --- /dev/null +++ "b/Ukj0ng/202510/12 BOJ G2 \353\221\220 \354\204\254\352\260\204\354\235\230 \354\235\264\353\217\231.md" @@ -0,0 +1,72 @@ +``` +import java.io.*; + +public class Main { + private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + private static int[] uf, size; + private static int N; + private static long d, bridge; + + public static void main(String[] args) throws IOException { + init(); + + bw.flush(); + bw.close(); + br.close(); + } + private static void init() throws IOException { + N = Integer.parseInt(br.readLine()); + d = 0; + bridge = 0; + + uf = new int[N+1]; + size = new int[N+1]; + + for (int i = 1; i <= N; i++) { + uf[i] = i; + size[i] = 1; + } + + for (int i = 0; i < N-1; i++) { + int a = Integer.parseInt(br.readLine()); + int b = a+1; + + int A = find(a); + int B = find(b); + + long sizeA = size[A]; + long sizeB = size[B]; + + d -= ((sizeA*(sizeA-1)/2) + (sizeB*(sizeB-1)/2)); + bridge -= ((sizeA*(sizeA*sizeA-1))/6 + (sizeB*(sizeB*sizeB-1))/6); + union(A, B); + + long newSize = sizeA + sizeB; + + d += newSize*(newSize-1)/2; + bridge += newSize*(newSize*newSize-1)/6; + + bw.write(d + " " + bridge + "\n"); + } + } + + private static void union(int X, int Y) { + if (X == Y) return; + + if (size[X] < size[Y]) { + uf[X] = Y; + size[Y] += size[X]; + } else { + uf[Y] = X; + size[X] += size[Y]; + } + } + + private static int find(int x) { + if (uf[x] == x) return x; + + return uf[x] = find(uf[x]); + } +} +```