티스토리 뷰

PS/문제풀이

BOJ 14870: 조개 줍기

JJaewon 2020. 8. 2. 13:41

Link

Tag

  • dp

  • Segment Tree

Time Complexity

  • $O(N^2lgN)$

 $N \times N$ 격자에 조개가 있다. 각 점에서 $(1,1)$로 최단거리로 이동하면서 조개를 주울 수 있는 최댓값을 구해야 한다. 한번만 구하는게 아니라, $N$개의 쿼리가 주어져서 한 지점의 조개 개수가 1 증가하거나 감소한다. 이때 모든 지역에서 주울 수 있는 조개 개수의 최댓값의 합을 출력해야 한다.

 먼저 $(1,1)$로 이동하는것을 $(1,1)$ 에서 각 지점으로 이동하는 것으로 바꾸어 생각하자. 그러고 나면 쿼리가 없는경우 아주 간단한 dp로 풀리는 것을 알 수 있다. 이제 쿼리를 어떻게 처리하느냐가 문제다.

 어떤 지점 $(r,c)$ 의 조개 개수가 변화했다고 하자. 그러면 이 지점에 직접적으로 영향을 받아 dp값이 바뀔 수 있는 지점은 $(r+1,c)$ 또는 $(r,c+1)$ 이다. 따라서 어떤 지점의 조개 개수가 변화했을 때, dp값이 바뀌는 부분을 행 단위로 잘라서 보면 시작점과 끝점이 단조 증가하는 형태이다.

 이제 투 포인터 느낌으로 dp값이 바뀌는 부분의 구간을 $O(N)$에 구해 줄 수 있겠다. 이제 이 dp값을 변화시키는게 문제인데, Range-update Point-query 세그먼트 트리를 N개 만들어 주면 업데이트도 $O(NlgN)$에 할 수 있다. 총 문제는 $O(N^2lgN)$에 해결 되겠다.

 

Code

 

'PS > 문제풀이' 카테고리의 다른 글

BOJ 21607: Polynomial and Easy Queries  (0) 2021.08.17
BOJ 16909: 카드 구매하기 3  (0) 2021.04.02
BOJ 16027: Global warming  (0) 2020.06.14
BOJ 17101: Dynamic Centroid  (0) 2020.06.13
BOJ 10060: 감시 카메라  (0) 2020.06.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함