깨끗한 바닥 위에 개의 먼지가 있다. 바닥은 좌표평면으로 생각할 수 있고, 번째 먼지는 좌표 위치에 있는 점으로 생각할 수 있다.
먼지를 좋아하는 사람은 없기 때문에, 폭이 인 걸레로 이 먼지들을 쓸어내고 싶다.
먼지는 싫지만 청소도 귀찮기 때문에, 이 걸레를 딱 한 번 직선으로 끌면서 청소를 하려고 한다. 당연하게도 한 번의 청소로 최대한 많은 먼지를 없애고 싶다. 먼지는 걸레의 경계에 닿아도 없어진다.
먼지의 개수, 걸레의 폭, 먼지의 좌표가 주어졌을 때 위와 같은 방법으로 최대한 많이 없앨 수 있는 먼지의 수를 구하는 프로그램을 작성하라.
입력 형식
첫 줄에 테스트 케이스의 수를 나타내는 정수 가 주어진다. ()
그다음 줄부터 각 테스트 케이스에 대한 정보가 주어진다.
- 각 테스트 케이스의 첫 줄에는 먼지의 수를 나타내는 정수 과 걸레의 폭을 나타내는 정수 이 주어진다. ( )
- 그다음 줄에 걸쳐 한 줄에 하나씩 먼지의 위치를 나타내는 두 개의 정수 , 가 공백으로 구분되어 주어진다. ()
- 하나의 테스트 케이스 안에서, 각 먼지의 위치는 서로 다르다.
모든 테스트 케이스에서의 값의 총합은 을 넘지 않는다.
출력 형식
첫 줄에 문제에서 요구하는 먼지의 최대 개수를 출력한다.
예제
입력
2 3 1 1 2 2 4 4 1 4 2 1 2 2 3 3 5 4 0
출력
2 3
예제 설명
-
첫 번째 테스트 케이스에서는 폭이 인 직선을 어떻게 긋더라도 최대 두 점만 직선 안에 포함시킬 수 있다. 따라서 답은 가 된다.
-
두 번째 테스트 케이스에서는 폭이 인 직선 안에 최대 개의 점을 넣을 수 있다.
아래 그림은 각각 첫 번째 테스트 케이스, 두 번째 테스트 케이스의 예이다.

채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 17점
종류 2: 28점
종류 3: 25점
종류 4: 30점
모든 입력 케이스가 주어진다.
해설
두 점이 하나의 경계 직선 위에 있는 최적의 띠 영역이 존재하므로 어떤 두 점을 지나는 직선을 경계로 하는 영역들만 고려하면 됩니다.
2차원에서 점들의 정렬 순서는 직선의 기울기에 따라 달라집니다. 두 점의 상대적인 순서는 이들을 지나는 직선을 축으로 삼을 때 뒤바뀌므로, 가능한 순서 변화는 개뿐입니다. 이 순서들을 에 모두 구할 수 있고, 각 순서마다 폭 의 띠 영역에 포함되는 최대 점 개수를 에 계산할 수 있으므로, 전체 시간 복잡도는 이 됩니다.
관찰을 해보면, 가능한 순서를 구하는 과정에서 순서가 바뀌는 점들을 지나는 직선을 경계로 하는 구간만 고려해도 된다는 것을 알 수 있습니다. 이 경우에는 이분탐색을 사용하여 해당 경우의 정답을 구할 수 있습니다. 전체 시간복잡도는 이 됩니다.