문제 링크
- http://icpc.me/16910
사용 알고리즘
- 세그 레이지
시간복잡도
- $O(N log N)$
풀이
세그먼트 트리를 이용해 존재하지 않는 가장 작은 원소는 쉽게 구할 수 있습니다.
수 i의 존재 여부를 i번째 리프노드에 저장하고, 구간합을 구하는 세그먼트 트리를 이용하면 할 수 있습니다.
그러므로 1번 쿼리는 [l, r] 구간을 1로 변경하는 쿼리, 2번 쿼리는 0으로 변경하는 쿼리, 3번 쿼리는 tree[node] = (e-s+1) - tree[node]
같은 형태로 변경하는 쿼리로 처리할 수 있습니다.
쿼리의 범위가 10^18이지만 좌표압축을 해주면 $O(N)$으로 줄여줄 수 있습니다. 모든 구간 [l, r]에 대해서 l, r+1만 저장해도 되지만, 저는 구현의 편의를 위해 l-1, l, l+1, r-1, r, r+1 총 6개를 넣었습니다.
레이지만 잘 처리해주면 쉽게 풀 수 있습니다.
전체 코드
1 |
|