티스토리 뷰
문제: http://www.ioi2011.or.th/hsc/tasks/KOR/elephants.pdf
대회 당시 이 문제에 상당히 많은 시간을 투자했다. 시간제한이 9초라는 것을 간과하고 단지 N 제한이 크다는 이유 만으로 해법이 $O(N lg N)$ 꼴로 나올 것이라 확신했었다. 부분 점수를 받기 위해 $O(N\sqrt{N})$ 꼴의 방법도 생각해보았지만, 실패했었다.
대회 끝나고 나오자마자 당시 조교로 있었던 권순일 형의 짧은 말로 이 문제의 해법을 깨닫게되었다. 2년이 지난 지금까지도 기억에 남는다.
시간복잡도는 $O(N\sqrt{N})$ 이 맞다. 안된다고 생각할 수 있지만, $\sqrt{N}$ 번의 update 마다 새로 그룹들을 $O(N)$만에 구성해주면된다. 그러면 총 시간복잡도를 $O(N\sqrt{N})$ 이고, 안되는 이유도 해결된다.
혼자서 충분히 생각할 수도 있었다고 생각이 들지만, 저 해법을 듣고 난 이후에 $O(N\sqrt{N})$ 방법에 대해 엄청 감동했었다. $\sqrt{N}$ 번 마다 새로 그룹들을 구성하면 된다는 사실이 너무나도 새로웠다.
본론으로 들어가 $O(N\sqrt{N})$ 방법을 설명하겠다. 우선 코끼리들을 위치 순서대로 나열한 다음에 그룹을 $\sqrt{N}$개로 나눈다. 그러면 $\sqrt{N}$개의 그룹과 각 그룹의 크기는 $\sqrt{N}$이 되어있다. 이 그룹들 사이에서 답을 구할 수 있다.
하나의 그룹 안에서 다음과 같은 정보들이 필요하다. 그룹 안의 코끼리에서부터 사진기를 놓기 시작한다면 그룹을 덮기 위해 몇 개의 사진기가 필요한지와, 이 때 카메라가 어디까지 멀리 찍을 수 있는지를 가지고 있는다. 처음에 그룹을 나누고 그룹별로 정보들을 갱신하는데 드는 시간복잡도는 $O(N)$ 이다.
코끼리의 이동을 두 동작으로 나누어 생각할 수 있다.
- 코끼리가 제거된다.
- 코끼리가 추가된다.
코끼리를 제거하는 것과 추가하는 것 각각의 시간복잡도는 $O(\sqrt{N})$ 이다. 그룹내의 배열에서 제거/추가하는데 $O(\sqrt{N})$, 그 배열의 정보를 다시 세팅하는데 $O(N\sqrt{N})$ 의 시간복잡도다.
여러 번의 이동 후 그룹의 크기가 매우 커지거나, 한 그룹이 사라질 수 있다. 대략 $\sqrt{N}$ 번의 이동마다, 새로 그룹들을 구성시켜주면 된다. 한 번 그룹들을 구성 시켜줄 때마다 시간복잡도가 $O(N)$이므로, 이 과정의 총 시간복잡도는 $O(N\sqrt{N})$ 이 된다.
따라서 이 해법의 시간복잡도는 $O(N\sqrt{N})$ 이고 시간제한이 9초라 만점을 받기에 충분하다. 미국의 Wenyu Cao가 97점을 받았는데, 그룹내에서 배열대신 vector를 사용하면 나온다고 한다.
'IOI > IOI2011' 카테고리의 다른 글
[IOI2011 Day2] Parrots 문제 고찰 및 해법 (1) | 2013.07.24 |
---|---|
[IOI2011 Day2] Crocodile 해법 (0) | 2013.07.24 |
[IOI2011 Day1] Race 해법 (4) | 2013.07.23 |
[IOI2011 Day1] Garden 해법 (3) | 2013.07.23 |
[IOI2011 Day1] Ricehub 해법 (0) | 2013.07.23 |
- Total
- Today
- Yesterday
- moore
- IOI2013
- optimization
- Tree
- Dijkstra
- dynamic programming
- Greedy Method
- ioi
- IOI2012
- Divide & Conquer
- majority
- Dynamic Pramming
- Knuth Optimization
- Boyer-Moore Majority Vote Algorithm
- z-trening
- Splay Tree
- BOI 2001
- USACO
- vote
- BOI 2009
- Boyer
- Algorithm
- Parametric Search
- HackerRank
- TRIE
- Segment tree
- idea
- IOI2011
- IOI2014
- BOI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |