DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

삼각별 찾기

문제로 돌아가기

해설

정점 vvv를 가운데 정점으로 고정하자. vvv와 인접한 각 방향으로 얼마나 멀리 뻗어 나갈 수 있는지를 생각한다.

어떤 방향으로 뻗어 나갈 수 있는 최대 길이를 그 방향의 길이라고 하자. 정점 vvv를 가운데 정점으로 하는 크기 KKK의 삼각별이 존재하려면, 길이가 KKK 이상인 방향이 적어도 333개 있어야 한다. 따라서 정점 vvv에서 가능한 가장 큰 삼각별의 크기는 vvv에서의 방향 길이들 중 세 번째로 큰 값이다.

이 값을 모든 정점에 대해 구하면 된다. 트리를 임의로 루트 잡고, 아래 방향 DP와 위 방향 DP를 한다.

downvdown_vdownv​를 vvv의 자식 방향으로 내려가서 도달할 수 있는 가장 먼 거리라고 하자. 이는 후위 순회로 구할 수 있다.

그 후 upvup_vupv​를 vvv에서 부모 방향으로 갔을 때 도달할 수 있는 가장 먼 거리라고 하자. 정점 vvv에서 자식 uuu로 upuup_u를 넘겨 줄 때는, 에서 방향을 제외한 다른 방향들 중 가장 긴 값을 사용하면 된다.

각 정점에서 자식 방향들의 길이 downu+1down_u+1downu​+1과, 루트가 아닌 경우 부모 방향의 길이 upvup_vupv​를 모아 상위 33개를 관리한다. 세 번째로 큰 값이 라면, 정점 는 크기 의 삼각별을 각각 하나씩 만든다.

마지막으로 차분 배열을 이용해 모든 vvv에 대해 구간 [1,Lv][1,L_v][1,Lv​]에 111을 더하면 답을 얻을 수 있다.

시간 복잡도는 O(N)O(N)O(N), 메모리 복잡도는 O(N)O(N)O(N)이다.

u
pu​
vvv
uuu
3
LvL_vLv​
vvv
1,2,…,Lv1,2,\ldots,L_v1,2,…,Lv​