문제 링크
- http://icpc.me/18798
사용 알고리즘
- 세그먼트 트리
시간복잡도
- $O(N log N + N log X)$
풀이
1번 쿼리로 인해 값이 바뀌는 원소를 찾는다면 값을 변경하는 것은 쉽게 할 수 있습니다. 결국, 우리는 1번 쿼리로 인해 값이 바뀌는 원소들을 빠르게 찾아야 합니다.
각 원소는 1번 쿼리로 인해 최대 30번만 변한다는 점을 이용해 문제를 풀어봅시다.
만약 쿼리로 들어온 X가 구간 [s, e]를 모두 and한 값의 부분집합이라면 구간 [s, e]는 업데이트를 해줄 필요가 없습니다. 이것은 구간의 원소를 and한 값을 관리하는 세그먼트 트리를 이용해 빠르게 처리할 수 있습니다.
한 번의 쿼리는 $O(N)$이 걸릴 수는 있지만, 각 원소는 최대 30번만 변하기 때문에 주어지는 쿼리를 모두 적용해도 $O(30N) = O(N log X)$만 걸립니다.
값이 K인 원소의 개수를 세어주는 것은 펜윅트리 등을 이용해 쉽게 처리할 수 있습니다.
자세한 구현은 코드를 참고하면 됩니다.
비슷한 아이디어를 사용하는 문제로는 BOJ16136이 있습니다.
전체 코드
1 |
|