답을 이하로 만들 수 있는지 판정하는 문제를 생각하자.
값을 바꾸지 않고 남겨 둘 위치들을 이라 하자. 연속한 두 위치 를 모두 남겨 두려면
가 필요하다. 이 조건은 충분하기도 하다. 두 끝값의 차이가 이하이면, 그 사이의 바뀐 원소들을 한 칸마다 최대 만큼 움직이도록 정수로 채울 수 있다. 맨 앞과 맨 뒤의 바뀐 구간도 항상 채울 수 있다.
따라서 적어도 개의 원래 값을 남길 수 있는지를 확인하면 된다.
서브태스크 4:
를 번 위치를 마지막으로 남겨 둘 때, 남길 수 있는 원래 값의 최대 개수라고 하자. 앞의 위치 와 함께 남길 수 있는 조건을 직접 확인하면
이다. 조건을 만족하는 가 없으면 최댓값을 으로 둔다.
순서로 계산하여 인지 확인한다. 한 번의 판정은 이고, 이를 이분 탐색에 사용하면 시간 복잡도는 , 공간 복잡도는 이다.
각 위치 에 대해
를 정의한다. 에 대해 위 조건은 다음 두 부등식과 동치이다.
점 를 가 큰 순서로 정렬하고, 가 같으면 가 작은 순서로 정렬한다. 이 순서에서 의 최장 비감소 부분수열 길이를 이라 하자. 그러면 은 동시에 남겨 둘 수 있는 원래 원소의 최대 개수와 같다.
이면 이므로 위의 두 좌표 조건을 만족하는 두 점의 순서는 원래 인덱스 순서와도 일치한다. 이면 이고, 비감소 부분수열에는 같은 값만 함께 들어갈 수 있으므로 역시 올바르다.
따라서 이면 가 가능하고, 그렇지 않으면 불가능하다. 최장 비감소 부분수열은 upper_bound를 이용해 에 구할 수 있다.
가능 여부는 가 커질수록 단조롭게 참이 된다. 부터 원래 수열의 최대 인접 차이까지 이분 탐색한다. 전체 시간 복잡도는 이고, 이다. 메모리 복잡도는 이다.
Solution written by GPT6