문제


https://www.acmicpc.net/problem/1177


풀이


각 학생에 대해 빙정식 (t초가 지난 후의 조쌤과 학생의 거리 <= R)을 푼다.

해가 존재하면 그 구간들을 모아, 스위핑 기법을 이용해 제일 많은 겹친 구간들의 개수를 구한다.

식을 세우는 것보단 스위핑이 더 어려웠다.

실수할 여지도 많은 문제였다.

방정식이 0차부터 2차까지 모두 될 수 있으며, 해가 없을 수도 있다.

해 구간이 0을 중간에 포함한다면 시작점을 0으로 옮겨야 된다.

스위핑은 끝점들을 최소힙에 담아 구현했다.


코드


import sys
from heapq import heappush, heappop

n, r, x, y, dx, dy = map(int, sys.stdin.readline().split())
time = []
default = 0

for i in range(n):
    z, w, dz, dw = map(int, sys.stdin.readline().split())

    a = (dx - dz) ** 2 + (dy - dw) ** 2
    b = (x - z) * (dx - dz) + (y - w) * (dy - dw)
    c = (x - z) ** 2 + (y - w) ** 2 - r ** 2

    if a == 0:
        if b == 0:
            if c <= 0:
                default += 1
        elif (b > 0) and (c <= 0):
            time.append((0, - c / (2 * b)))
        
        continue
    
    D = b ** 2 - a * c

    if D >= 0:
        sol1 = (- b - D ** 0.5) / a
        sol2 = (- b + D ** 0.5) / a
        if sol2 >= 0:
            time.append((max(0, sol1), sol2))

time.sort()
end = []
ans = 0

for i in range(len(time)):
    p, q = time[i]
    heappush(end, q)

    while heap[0] < p:
        heappop(end)
    
    ans = max(ans, len(end))

print(default + ans)

Leave a comment