Skip to content

Commit 80f3a50

Browse files
committed
[Gold V] Title: 트리와 쿼리, Time: 84 ms, Memory: 103508 KB -BaekjoonHub
1 parent e2b69a9 commit 80f3a50

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# [Gold V] 트리와 쿼리 - 15681
2+
3+
[문제 링크](https://www.acmicpc.net/problem/15681)
4+
5+
### 성능 요약
6+
7+
메모리: 103508 KB, 시간: 84 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍, 그래프 이론, 그래프 탐색, 트리, 깊이 우선 탐색, 트리에서의 다이나믹 프로그래밍
12+
13+
### 제출 일자
14+
15+
2025년 5월 30일 18:48:14
16+
17+
### 문제 설명
18+
19+
<p>간선에 가중치와 방향성이 없는 임의의 루트 있는 트리가 주어졌을 때, 아래의 쿼리에 답해보도록 하자.</p>
20+
21+
<ul>
22+
<li>정점 U를 루트로 하는 서브트리에 속한 정점의 수를 출력한다.</li>
23+
</ul>
24+
25+
<p>만약 이 문제를 해결하는 데에 어려움이 있다면, 하단의 힌트에 첨부한 문서를 참고하자.</p>
26+
27+
### 입력
28+
29+
<p>트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 10<sup>5</sup>, 1 ≤ R ≤ N, 1 ≤ Q ≤ 10<sup>5</sup>)</p>
30+
31+
<p>이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V)</p>
32+
33+
<p>이는 U와 V를 양 끝점으로 하는 간선이 트리에 속함을 의미한다.</p>
34+
35+
<p>이어 Q줄에 걸쳐, 문제에 설명한 U가 하나씩 주어진다. (1 ≤ U ≤ N)</p>
36+
37+
<p>입력으로 주어지는 트리는 항상 올바른 트리임이 보장된다.</p>
38+
39+
### 출력
40+
41+
<p>Q줄에 걸쳐 각 쿼리의 답을 정수 하나로 출력한다.</p>
42+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import Foundation
2+
3+
class FileIO {
4+
@inline(__always) private var buffer: [UInt8] = Array(FileHandle.standardInput.readDataToEndOfFile()) + [0], byteIdx = 0
5+
6+
@inline(__always) private func readByte() -> UInt8 {
7+
defer { byteIdx += 1 }
8+
return buffer.withUnsafeBufferPointer { $0[byteIdx] }
9+
}
10+
11+
@inline(__always) func readInt() -> Int {
12+
var number = 0, byte = readByte(), isNegative = false
13+
while byte == 10 || byte == 32 { byte = readByte() }
14+
if byte == 45 { byte = readByte(); isNegative = true }
15+
while 48...57 ~= byte { number = number * 10 + Int(byte - 48); byte = readByte() }
16+
return number * (isNegative ? -1 : 1)
17+
}
18+
}
19+
20+
let io = FileIO()
21+
22+
let n = io.readInt(),
23+
r = io.readInt(),
24+
q = io.readInt()
25+
26+
var graph = [[Int]](repeating: [Int](), count: n+1)
27+
var subTreeSizeList = [Int](repeating: 0, count: n+1)
28+
29+
(0..<n-1).forEach { _ in
30+
let u = io.readInt()
31+
let v = io.readInt()
32+
graph[u].append(v)
33+
graph[v].append(u)
34+
}
35+
36+
func dfs(_ root: Int) {
37+
subTreeSizeList[root] = 1
38+
for node in graph[root] {
39+
guard subTreeSizeList[node] == 0 else { continue }
40+
dfs(node)
41+
subTreeSizeList[root] += subTreeSizeList[node]
42+
}
43+
}
44+
45+
let root = r
46+
dfs(root)
47+
48+
let answer = (0..<q).map { _ in
49+
let query = io.readInt()
50+
let answer = subTreeSizeList[query]
51+
return "\(answer)\n"
52+
}.joined()
53+
54+
print(answer)

0 commit comments

Comments
 (0)