DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

ABAB

문제로 돌아가기

해설

먼저 값들을 좌표 압축한다. 이후 같은 값인지 여부만 사용하므로 좌표 압축은 답에 영향을 주지 않는다.

각 값 xxx에 대해 다음 두 값을 관리한다.

  • last⁡[x]\operatorname{last}[x]last[x]: 수열 전체에서 xxx가 마지막으로 등장하는 위치.
  • recent⁡[x]\operatorname{recent}[x]recent[x]: 현재 위치보다 앞에서 xxx가 가장 최근에 등장한 위치.

현재 kkk번 위치를 처리하며 x=Akx=A_kx=Ak​라 하자. xxx가 이전에 등장한 위치를 i=recent⁡[x]i=\operatorname{recent}[x]i=라 하면, 다음 조건을 만족하는 값 가 존재할 때 정답은 이다.

i<recent⁡[y]<k<last⁡[y].i<\operatorname{recent}[y]<k<\operatorname{last}[y].i<recent[y]<k<last[y].

실제로 j=recent⁡[y]j=\operatorname{recent}[y]j=recent[y], l=last⁡[y]l=\operatorname{last}[y]l=last[y]로 두면

i<j<k<l,Ai=Ak=x,Aj=Al=yi<j<k<l,\qquad A_i=A_k=x,\qquad A_j=A_l=yi<j<k<l,Ai​=

가 된다. 또한 recent⁡[y]>i=recent⁡[x]\operatorname{recent}[y]>i=\operatorname{recent}[x]recent[y]>i=recent[x]이므로 x≠yx\neq yx=y이다.

따라서 현재 위치보다 뒤에 다시 등장할 값들 중 recent⁡\operatorname{recent}recent가 가장 큰 값을 빠르게 알아내면 된다.

어떤 값 xxx가 ttt번 위치에 등장했고 last⁡[x]>t\operatorname{last}[x]>tlast[x]>t라면, 쌍 (t,x)(t,x)(t,x)를 스택의 뒤에 추가한다. 추가되는 위치 tt는 항상 증가하므로, 유효한 쌍들 가운데 위치가 가장 큰 쌍은 항상 스택의 가장 뒤쪽에 있다.

kkk번 위치를 처리하기 전에 스택의 뒤에서 다음 중 하나를 만족하는 쌍 (t,y)(t,y)(t,y)를 계속 제거한다.

  • recent⁡[y]≠t\operatorname{recent}[y]\neq trecent[y]=t. 이후에 yyy가 다시 등장하여 이 쌍이 오래된 정보가 된 경우이다.
  • last⁡[y]≤k\operatorname{last}[y]\leq klast[y]≤. 가 번 위치보다 뒤에 더 이상 등장하지 않는 경우이다.

제거가 끝난 뒤 스택의 마지막 쌍은, 현재 위치보다 뒤에 다시 등장하는 모든 값 중 가장 큰 최근 등장 위치를 나타낸다. 따라서 xxx가 이전에 등장했고 스택의 마지막 위치가 recent⁡[x]\operatorname{recent}[x]recent[x]보다 크면 YES이다.

이제 이 판정이 모든 가능한 답을 찾음을 보이자. 답이 되는

i<j<k<l,Ai=Ak=x,Aj=Al=yi<j<k<l,\qquad A_i=A_k=x,\qquad A_j=A_l=yi<j<k<l,Ai​=

가 존재한다고 하자. jjj보다 뒤에 처음 등장하는 xxx의 위치를 k′k'k′라 하고, 그 직전 xxx의 등장 위치를 i′i'i라 하자. 그러면

i′≤i<j<k′≤k<li'\leq i<j<k'\leq k<li′≤i<j<k′≤k<

이다. k′k'k′번 위치를 처리할 때 yyy의 최근 등장 위치는 jjj 이상이고, 마지막 등장 위치는 lll 이상이다. 따라서 스택에는 위치가 i′i'i보다 큰 유효한 쌍이 존재하며 알고리즘이 반드시 를 출력한다.

각 쌍은 스택에 한 번 추가되고 한 번만 제거되므로 좌표 압축 이후의 스캔은 O(N)O(N)O(N)이다. 좌표 압축을 포함한 전체 시간 복잡도는 O(Nlog⁡N)O(N\log N)O(NlogN), 공간 복잡도는 O(N)O(N)O(N)이다.

Solution written by GPT5.6

recent[x]
yyy
YES
Ak​
=
x,Aj​=
Al​=
y
t
k
yyy
kkk
Ak​
=
x,Aj​=
Al​=
y
′
l
′
YES