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

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

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

꼬인 전선

문제로 돌아가기

해설

각 전선 iii를 현재 두 끝점 사이의 구간으로 생각하자.

도달 가능한 배치

다음 보조정리를 사용한다.

처음에 iii번 전선이 [ai,bi][a_i,b_i][ai​,bi​]를 연결한다고 하자. 길이 2N2N2N의 수열 CCC에서 각 번호가 정확히 두 번 나타난다. 각 iii에 대해 iii가 나타나는 두 위치가 모두 [ai,bi][a_i,b_i][ai​,bi​] 안에 있는 것과, CCC가 연산으로 도달 가능한 것은 동치이다.

한 번의 연산에서 두 전선의 새 끝점은 각각 그 전선의 기존 두 끝점 사이에 있다. 따라서 도달 가능한 모든 배치는 위 조건을 만족한다.

역방향은 표준적인 uncrossing 보조정리로 증명할 수 있다. 현재 배치와 목표 배치의 같은 번호 간선을 겹쳐 그리면 짝수 길이의 교대 사이클들로 분해된다. 현재 배치와 목표 배치가 다르면, 어떤 교대 사이클에는 현재의 교차 간선 두 개가 존재하며 그 교차를 문제의 방향으로 풀어도 각 목표 간선은 같은 번호의 새 구간 안에 남는다. 이 연산은 현재 구간 길이의 합을 엄격히 감소시킨다. 이를 반복하고 구간 길이의 합에 대해 귀납하면 목표 배치에 도달한다.

따라서 문제는 다음 스케줄링 문제와 같다.

  • 전선 iii는 번호가 iii인 동일한 작업 두 개를 가진다.
  • 두 작업은 각각 aia_iai​ 이상 bib_ib 이하의 위치에 배치해야 한다.
i​
  • 모든 위치에는 작업 하나를 배치한다.
  • 완성된 번호 수열을 사전 순으로 최소화한다.
  • 현재 위치에서 선택할 수 있는 번호

    위치 ppp까지 왼쪽에서 오른쪽으로 답을 정한다고 하자. rir_iri​를 아직 배치하지 않은 iii번 작업의 개수라 하자. rir_iri​는 0,1,20,1,20,1,2 중 하나이다.

    d≥pd \geq pd≥p에 대해 다음 여유도를 정의한다.

    S(d)=d−p+1−∑bi≤dri.S(d)=d-p+1-\sum_{b_i\leq d}r_i.S(d)=d−p+1−bi​≤d∑​ri​.

    마감 위치가 ddd 이하인 모든 남은 작업은 p,p+1,⋯ ,dp,p+1,\cdots,dp,p+1,⋯,d 안에 들어가야 하므로 항상 S(d)≥0S(d)\geq0S(d)≥0이어야 한다.

    현재 위치 ppp에 전선 iii를 하나 배치한 뒤 p+1p+1p+1로 이동한다고 하자. 새 여유도는 다음과 같이 변한다.

    • d<bid<b_id<bi​이면 S(d)S(d)S(d)가 111 감소한다.
    • d≥bid\geq b_id≥bi​이면 S(d)S(d)S(d)가 변하지 않는다.

    zzz를 S(z)=0S(z)=0S(z)=0인 가장 작은 z≥pz\geq pz≥p라 하자. 전체 남은 작업 수와 남은 위치 수가 같으므로 S(2N)=0S(2N)=0S(2N)=0이고, zzz는 항상 존재한다.

    전선 iii를 현재 위치에 배치한 뒤에도 가능한 배치가 남는 조건은 정확히 다음 두 조건이다.

    • ai≤pa_i\leq pai​≤p이고 ri>0r_i>0ri​>0이다.
    • bi≤zb_i\leq zbi​≤z이다.

    두 번째 조건이 필요하다는 것은 여유도 변화에서 바로 알 수 있다. 충분성은 단위 작업의 구간 매칭에 대한 Hall 조건으로 보일 수 있다. 현재 위치를 제거했을 때 새로 빡빡해질 수 있는 Hall 조건은 왼쪽 끝이 현재 위치인 구간뿐이며, 이 조건들이 바로 위의 여유도 조건이다.

    따라서 매 위치에서 위 조건을 만족하는 가장 작은 전선 번호를 선택하면 사전 순 최솟값을 얻는다.

    자료 구조

    두 개의 세그먼트 트리를 사용한다.

    첫 번째 트리는 모든 S(d)S(d)S(d)를 저장한다. 구간 덧셈과 ppp 이상에서 값이 000인 첫 위치 찾기를 지원한다. 전선 iii를 선택하면 구간 [p,bi−1][p,b_i-1][p,bi​−1]에 −1-1−1을 더한다.

    두 번째 트리는 마감 위치 bib_ibi​를 인덱스로 사용한다. ai≤pa_i\leq pai​≤p이고 ri>0r_i>0ri​>0인 전선 iii에 대해 위치 bib_ibi​에 값 iii를 저장하고, 나머지는 무한대로 둔다. 구간 [p,z][p,z][p,z]의 최솟값이 현재 선택할 번호이다. 전선을 두 번 사용하면 해당 위치의 값을 무한대로 바꾼다.

    각 위치에서 세그먼트 트리 연산을 상수 번 수행하므로 시간 복잡도는 O(Nlog⁡N)O(N\log N)O(NlogN)이고, 공간 복잡도는 O(N)O(N)O(N)이다.

    Solution written by GPT5.6