RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
포럼
R01510

동아리 합병 횟수 세기

Silver II 실버 II
난이도
2s
시간 제한
256MB
메모리 제한
0
맞았습니다!!
0
제출 수
0.0%
정답률
레이팅

의견: 0

설명

새 학기를 맞아 한 대학에 \(N\) 개의 신입생 동아리가 만들어졌다. 동아리에는 \(1\) 번부터 \(N\) 번까지 번호가 붙어 있으며, 처음에는 모두 서로 다른 독립된 동아리이다.

시간이 흐르면서 총 \(M\) 건의 합병 신청이 시간 순서대로 접수된다. \(i\) 번째 신청은 두 동아리 번호 \(a\), \(b\) 로 이루어지며, 두 동아리를 하나로 합쳐 달라는 요청이다. 합병이 거듭되면 여러 동아리가 하나의 동아리로 묶일 수 있다.

어떤 신청이 접수되었을 때, \(a\) 가 속한 동아리와 \(b\) 가 속한 동아리가 서로 다른 동아리라면 두 동아리가 실제로 합쳐지므로 이 신청을 유효 합병이라고 부른다. 반대로 \(a\)\(b\) 가 (그동안의 합병으로) 이미 같은 동아리에 속해 있다면 합병이 일어나지 않으므로 이 신청은 무시된다. (같은 동아리를 가리키는 \(a = b\) 인 신청도 무시된다.)

\(M\) 건의 신청을 순서대로 처리할 때, 그중 유효 합병이 몇 번 일어나는지 세는 프로그램을 작성하라.

제약

\(1 \le N \le 200{,}000\)

\(0 \le M \le 500{,}000\)

\(1 \le a, b \le N\)

입력 형식

첫째 줄에 동아리의 수 \(N\) 과 합병 신청의 수 \(M\) 이 공백으로 구분되어 주어진다 (\(1 \le N \le 200{,}000\), \(0 \le M \le 500{,}000\)).

이어지는 \(M\) 개의 줄에는 각각 두 정수 \(a\), \(b\) (\(1 \le a, b \le N\)) 가 주어지며, 이는 시간 순서대로 접수된 합병 신청을 의미한다.

출력 형식

\(M\) 건의 신청 중 유효 합병이 일어난 횟수를 한 줄에 출력한다.

예제 1
입력
5 6
1 2
2 3
1 3
4 5
5 4
3 3
출력
3
설명

합병 신청을 순서대로 처리한다.

(1 2): 서로 다른 동아리 → 유효 합병 (누적 1)
(2 3): 1·2와 3은 다른 동아리 → 유효 합병 (누적 2)
(1 3): 이미 같은 동아리 → 무시
(4 5): 서로 다른 동아리 → 유효 합병 (누적 3)
(5 4): 이미 같은 동아리 → 무시
(3 3): 같은 동아리(자기 자신) → 무시

유효 합병은 총 3번이다.

예제 2
입력
3 0
출력
0
설명

합병 신청이 한 건도 없으므로 유효 합병은 0번이다.

문제 정보

riseoj 작성

출처 Original

평가 및 의견

동아리 합병 횟수 세기

개요
출제자 난이도 Silver II 실버 II 의견 0 / 50 공개 집계 (커뮤니티 난이도, 주요 주제, 품질)는 의견이 충분히 모이면 공개됩니다.

Log in to rate problems.

개별 의견

아직 의견이 없습니다. 자격이 된다면 위 양식에서 가장 먼저 평가해 보세요.

풀이 제출

동아리 합병 횟수 세기

게스트로 둘러보고 있습니다. 로그인하면 풀이를 제출하고 진행 상황을 확인할 수 있습니다. 로그인하고 제출하기
공개
C++20 Tab 들여쓰기 · Ctrl+/ 주석 토글 · Enter 자동 들여쓰기
1 1 1 0 공백: 4 · UTF-8