난이도 : Silver 3
Link : https://www.acmicpc.net/problem/11663
Tag : 이분탐색, 정렬
풀이일자 : 2024년 9월 22일
N : 점의 개수
M : 선분의 개수
grid : 점 좌표
본 문제는 주어진 점과 선분에서 시작점과 끝점이 주어졌을 때 주어진 점이 몇개 있는지 구하는 문제이다.
주어진 점을 정렬하는 시간O(nlogn)
M개의 선분을 이분 탐색으로 처리하는 시간 O(mlogn)
따라서 전체적인 시간복잡도는 nlogn + mlogn 이다.
먼저 주어진 점의 좌표를 정렬하여 이분탐색 할 수 있는 상태로 만들 것이다.
그리고 매번 주어지는 시작점과 끝점의 위치를 탐색하기 위해 이분탐색을 도입할 것이다.
이분탐색을 통해 시작점과 끝점에서 포함되는 점의 개수를 출력하면 끝이다.
import sys
n,m = map(int, sys.stdin.readline().split()) #n:점 m:선분 개수
grid = list(map(int, sys.stdin.readline().split()))
grid = sorted(grid)
def find_start(a):
start = 0
end = n - 1
while start <= end:
mid = (start + end) // 2
if grid[mid] < a:
start = mid + 1
else:
end = mid - 1
return end + 1
def find_end(b):
start = 0
end = n - 1
while start <= end:
mid = (start + end) // 2
if grid[mid] > b:
end = mid - 1
else:
start = mid + 1
return end
for i in range(m):
a,b = map(int, sys.stdin.readline().split())
print(find_end(b)-find_start(a) + 1)