일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 삼분탐색
- 이분탐색
- 플로이드와샬
- MST
- 다익스트라
- 크루스칼
- 정렬
- 좌표압축
- DisjointSet
- 브루트포스
- 펜윅트리
- lis
- boj
- LazyPropagation
- 수학
- 에라토스테네스의 체
- dfs
- 비트마스크
- BFS
- 백준
- DP
- lca
- 구현
- 위상정렬
- 세그먼트트리
- 투포인터
- 이분매칭
- 누적합
- 그리디
- 이진탐색
Archives
- Today
- Total
lastknight00
[백준]집합의 표현(1717) 본문
문제 링크 : [백준]집합의 표현(1717)
문제 설명
0부터 N개까지 각각의 수를 원소로 하는 N+1개의 집합({0},{1},...,{N})이 존재합니다.
이 때, M개의 연산이 주어지는데, 다음과 같습니다.
- 0 A B : 숫자 A가 속한 집합과 숫자 B가 속한 집합을 합합니다.(합집합)
- 1 A B : 숫자 A가 속한 집합과 숫자 B가 속한 집합이 같은 집합인지를 출력합니다.
입력
N(원소의 갯수, 1 <= N <= 1,000,000)
M(쿼리의 갯수, 1 <= M <= 100,000)
O A B(쿼리 정보)
7 8
0 1 3
1 1 7
0 7 6
1 7 1
0 3 7
0 4 2
0 1 1
1 1 1
출력
NO
NO
YES
카테고리
#DisjointSet
시간 복잡도 상한
O(MlogN)
해결 방법
- DisjointSet을 이용하여 입력 받은 두 수의 그룹을 관리하여 처리합니다.
시간복잡도
O(M)
코드
#include<cstdio>
int n,m,d[1000001],a,b,c;
int f(int a){
if(a==d[a])return a;
return d[a]=f(d[a]);
}
void u(int a,int b){
d[f(a)]=f(b);
}
int main(){
for(n=1;n<1000001;n++)d[n]=n;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&a,&b,&c);
if(a)printf("%s\n",f(b)==f(c)?"YES":"NO");
else u(b,c);
}
}
'PS' 카테고리의 다른 글
[백준]게임 개발(1516) (0) | 2020.08.08 |
---|---|
[백준]키 순서(2458) (0) | 2020.08.08 |
[백준]성대나라의 물탱크(18227) (0) | 2020.07.26 |
[백준]미로에 갇힌 건우(18224) (0) | 2020.07.26 |
[백준]무엇을 아느냐가 아니라 누구를 아느냐가 문제다(9694) (0) | 2020.07.20 |
Comments