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

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

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

치터와 쿼리

문제로 돌아가기

해설

거짓말쟁이 구간을 [L,R][L,R][L,R]이라 하자. iii번 사람이 거짓말쟁이라는 조건은 i∈[L,R]i \in [L,R]i∈[L,R]이고, iii번 사람의 주장이 참이라는 조건은 [li,ri][l_i,r_i][li​,ri​]가 [L,R][L,R][L,R]과 교차하는 것이다. 두 조건의 참과 거짓은 서로 반대여야 한다.

각 사람에 대해 다음 네 값을 정의한다.

ai=min⁡(i,ri),bi=max⁡(i,li),ci=min⁡(i,li),di=max⁡(i,ri).a_i=\min(i,r_i),\qquad b_i=\max(i,l_i),\qquad c_i=\min(i,l_i),\qquad d_i=\max(i,r_i).ai​=min(i,r

iii번 사람이 구간 안에 있으면서 주장이 참인 경우는 정확히 L≤aiL \leq a_iL≤ai​이고 bi≤Rb_i \leq Rbi​인 경우이다.

iii번 사람이 구간 밖에 있으면서 주장도 거짓인 경우는 다음 세 형태 중 하나이다.

  • R<ciR<c_iR<ci​.
  • di<Ld_i<Ldi​<L.
  • . 마지막 형태는 와 주장 구간이 서로 떨어져 있을 때 그 사이에 거짓말쟁이 구간이 놓이는 경우이다.

따라서 다음 값을 정의한다.

A=min⁡idi,B=max⁡ici,A=\min_i d_i,\qquad B=\max_i c_i,A=imin​di​,B= M(L)=max⁡ai<Lbi,G(L)=min⁡ai≥Lbi.M(L)=\max_{a_i<L} b_i,\qquad G(L)=\min_{a_i\geq L} b_i.M(L)=ai​<Lmax​

M(L)M(L)M(L)의 집합이 비어 있으면 000, G(L)G(L)G(L)의 집합이 비어 있으면 N+1N+1N+1로 정의한다.

구간 [L,R][L,R][L,R]이 정답일 필요충분조건은 다음과 같다.

L≤A,max⁡(B,L,M(L))≤R<G(L).L\leq A,\qquad \max(B,L,M(L))\leq R<G(L).L≤A,max(B,L,M(L))≤R<G(L).

첫 번째 부등식은 모든 di<Ld_i<Ldi​<L 형태를 막는다. R≥BR\geq BR≥B는 모든 R<ciR<c_iR< 형태를 막는다. 는 형태를 막는다. 마지막으로 는 이고 인 사람을 없앤다. 따라서 이 조건들은 위의 모든 모순을 정확히 제거한다.

이제 동적으로 M(L)M(L)M(L)과 G(L)G(L)G(L)을 다룬다. 각 좌표 xxx에 대해 다음 두 값을 유지한다.

hix=max⁡ai=xbi,lox=min⁡ai=xbi.\mathrm{hi}_x=\max_{a_i=x} b_i,\qquad \mathrm{lo}_x=\min_{a_i=x} b_i.hix​=a

그러면 M(L)M(L)M(L)은 hi\mathrm{hi}hi의 접두 최댓값이고, G(L)G(L)G(L)은 lo\mathrm{lo}lo의 접미 최솟값이다. 같은 aia_ia를 가진 여러 사람은 multiset으로 관리한다. 와 도 각각 와 의 multiset으로 관리한다.

좌표 1,2,⋯ ,N1,2,\cdots,N1,2,⋯,N을 크기 약 N\sqrt NN​인 블록으로 나눈다. 블록 안의 각 후보 에 대해 다음 값을 미리 계산한다.

XL=max⁡(L,max⁡s≤x<Lhix),YL=min⁡L≤x≤elox.X_L=\max\left(L,\max_{s\leq x<L}\mathrm{hi}_x\right),\qquad Y_L=\min_{L\leq x\leq e}\mathrm{lo}_x.XL​=max(L,

XLX_LXL​과 YLY_LYL​은 모두 LLL에 대해 감소하지 않는다. 또한 XL<YLX_L<Y_L인 위치들을 따로 저장한다.

현재 블록보다 앞의 hi\mathrm{hi}hi 최댓값을 PPP, 뒤 블록들의 lo\mathrm{lo}lo 최솟값을 SSS라 하자. 이 블록의 후보 LLL이 가능하려면

max⁡(B,P,XL)<min⁡(S,YL)\max(B,P,X_L)<\min(S,Y_L)max(B,P,XL​)<min(S,YL​

이어야 한다. 이는 다음 네 조건과 동치이다.

  • max⁡(B,P)<S\max(B,P)<Smax(B,P)<S.
  • XL<SX_L<SXL​<S.
  • YL>max⁡.

XL,YLX_L,Y_LXL​,YL​이 단조이므로 두 번의 이분 탐색으로 가능한 위치 범위를 구하고, 저장해 둔 XL<YLX_L<Y_LXL​ 위치가 그 범위에 있는지 확인할 수 있다. 찾았다면

R=max⁡(B,P,XL)R=\max(B,P,X_L)R=max(B,P,XL​)

로 두면 된다. L≤AL\leq AL≤A인 후보만 조사한다.

한 번의 주장 변경은 기존 좌표 aia_iai​와 새로운 좌표 aia_iai​가 속한 블록만 바꾼다. 따라서 최대 두 블록을 다시 계산하면 된다.

각 변경의 시간 복잡도는 O(Nlog⁡N)O(\sqrt N\log N)O(N​logN)이고, 전체 메모리 복잡도는 O(N)O(N)O(N)이다.

Solution written by GPT5.6

i​
)
,
bi​
=
max(i,li​),ci​=
min(i,li​),di​=
max(i,ri​).
≤
R
ai<L≤R<bia_i<L \leq R<b_i
ai​<L≤R<bi​
iii
imax​
ci​
,
bi​
,
G
(
L
)
=
ai​≥Lmin​bi​.
c
i​
R≥M(L)R\geq M(L)R≥M(L)
ai<L≤R<bia_i<L \leq R<b_iai​<L≤R<bi​
R<G(L)R<G(L)R<G(L)
L≤aiL\leq a_iL≤ai​
bi≤Rb_i\leq Rbi​≤R
i
​
=
x
max
​
bi​
,
lox​
=
ai​=xmin​bi​.
i​
AAA
BBB
did_idi​
cic_ici​
[s,e][s,e]
[s,e]
LLL
s≤x<L
max
​
hix​
)
,
YL​
=
L≤x≤emin​lox​.
XL​<YL​
)
(B,P)Y_L>\max(B,P)
YL​>max(B,P)
  • XL<YLX_L<Y_LXL​<YL​.
  • <
    YL​