문제 링크
- http://icpc.me/3444
문제 출처
- 2007 CERC S번
사용 알고리즘
- Splay Tree
시간복잡도
- $O(N \log N)$
풀이
구간을 flip하는 연산과 임의의 수가 몇 번째에 있는지 찾는 연산이 필요합니다. Splay Tree는 이런 연산을 amortized $O(\log N)$에 할 수 있습니다.
구간을 뒤집는 것은 단순히 Splay Tree에서 Lazy Propagation을 해주면 됩니다.
임의의 수가 몇 번째에 있는지 찾는 것이 어려울 수 있는데, 처음에 Splay Tree를 만들 때 각 정점의 포인터를 미리 저장해놓고, 원하는 정점을 Splay 시킨 뒤 왼쪽 자식 정점을 루트로 하는 서브트리의 크기만 구해주면 됩니다.
전체 코드
1 |
|