각 x (1≤x≤n)에 대해 길이 m의 이진 문자열 Ax를 정의하자. Ax[i]는 li≤x≤ri이면 1, 아니면 0이다.
두 이진 문자열 P,Q의 서로 다른 위치의 개수를 dist(P,Q)라고 하자. 어떤 답변 문자열 B가 두 후보 x,y와 모두 모순되지 않으려면
dist(Ax,B)≤k,dist(Ay,B)≤k
를 만족해야 한다.
삼각 부등식에 의해 이런 B가 존재하려면 dist(Ax,Ay)≤2k여야 한다. 반대로 Ax와 Ay가 다른 위치를 두 집합으로 최대한 균등하게 나누어 한쪽에서는 Ax, 다른 쪽에서는 Ay의 비트를 택하면
k=⌈2dist(Ax,Ay)⌉
로 두 후보를 동시에 가능하게 만들 수 있다. 따라서 정답은
⌈211≤x<y≤nmindist(Ax,Ay)⌉
이다.
이제 모든 쌍의 최소 거리를 구한다. 하나의 질문 구간 [l,r]은 x<y인 쌍 중 정확히 한쪽만 구간에 포함되는 경우에만 거리에 1을 더한다. 이러한 쌍은 다음 두 직사각형으로 나뉜다.
[1,l−1]×[l,r],[l,r]×[r+1,n].
두 번째 좌표 y를 1부터 n까지 증가시키며 스위핑한다. 현재 세그먼트 트리의 x번 값은 x<y인 위치에 대해 dist(Ax,Ay)가 되도록 관리한다.
구간 [l,r]에 대해 필요한 이벤트는 다음과 같다.
- y=l일 때 구간 [1,l−1]에 1을 더한다.
- y=r+1일 때 구간 [1,l−1]에서 1을 빼고, 구간 [l,r]에 1을 더한다.
각 y에서 이벤트를 모두 적용한 뒤 세그먼트 트리의 구간 [1,y−1]의 최솟값을 확인한다. 모든 y에 대한 최솟값이 필요한 최소 해밍 거리이다.
각 질문은 상수 번의 구간 덧셈만 만들며, 세그먼트 트리는 구간 덧셈과 구간 최솟값을 O(logn)에 처리한다. 전체 시간 복잡도는 O((n+m)logn)이고, 공간 복잡도는 O(n+m)이다.
Solution written by GPT5.6