BOJ 31956 MountainCraft

BOJ 31956 MountainCraft

문제 링크:

문제 내용

최초에 비어 있는 평면에 산을 추가하고 제거하는 쿼리가 주어집니다. 매 쿼리마다, 산들이 이루는 맨 위쪽 테두리의 길이를 구하세요.

산은 산꼭대기의 좌표로 정의되며, 산꼭대기를 나타내는 점으로부터 왼쪽으로 기울기가 11, 오른쪽으로 기울기가 1-1인 반직선을 그어 xx축과 만나는 지점에서 종료됩니다.

입력

첫 줄에는 쿼리의 개수 qq와 평면의 가로 길이 ww가 주어집니다. (1q200  0001 \le q \le 200\;000, 1w1091 \le w \le 10^9) 평면의 xx좌표는 00에서 ww까지가 됩니다.

다음 qq줄에는 각각 추가하거나 제거할 산꼭대기의 좌표 (x,y)(x, y)가 주어집니다. (0xw0 \le x \le w, 0<y1090 < y \le 10^9) 현재 그 산꼭대기가 존재하지 않는다면 추가하고, 존재한다면 제거합니다.

출력

qq줄에 걸쳐서 각 쿼리 이후의 문제의 정답을 출력합니다. 실제 정답과 절대 또는 상대 오차가 10610^{-6} 이하이면 통과됩니다.

문제 풀이

스포일러

여러 개의 산이 어디서 만나고 어디서 겹치고 어디서 끊어지는지는 중요하지 않다는 관찰이 필요합니다. 산이 차지하는 xx좌표의 범위를 알면 그 범위의 총 길이 ×2\times \sqrt{2}가 정답입니다.

그 뒤에는, 모든 쿼리의 산의 시작점과 끝점의 xx좌표를 모아서 좌표압축을 한 뒤에 length of min 레이지 세그먼트 트리(속칭 화성지도 세그)를 사용하면 됩니다.

Last updated on