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

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

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

두 개의 덱

문제로 돌아가기

해설

우선 쿼리 하나에 대한 답을 수학적으로 정리해 보자. 쿼리로 바닥 카드의 구간 [li,ri][l_i, r_i][li​,ri​]가 들어왔다고 가정하자. 해당 범위 내에 vvv가 적힌 카드의 수를 cvc_vcv​라 하고, 손 카드 중 vvv가 적힌 카드의 수를 dvd_vdv​라 하자. 이때 해당 쿼리의 답을 아래와 같이 나타낼 수 있다.

∑i=1nmin⁡(ci,di).\sum_{i=1}^n \min(c_i, d_i).i=1∑n​min(ci​,d

문제의 풀이에 대한 직관을 유도하기 위해, 더 쉬운 부분문제를 풀어보자. 모든 did_idi​가 111이라고 가정하자. 이때, 문제는 QQQ개의 구간 [li,ri][l_i, r_i][l에 대해 구간 내의 서로 다른 수의 개수를 구하는 문제가 된다. 이 문제를 해결하는 방법 중 하나는 문제를 2D 구간 합 문제로 환원하는 것이다. 격자 가 있다고 하고, 행 열의 칸을 와 같이 나타내자. 처음에 모든 칸에 이 적혀 있다고 가정한 뒤, 다음 규칙에 맞게 격자의 일부 칸을 수정한다.

  • 모든 1≤i≤n1 \le i \le n1≤i≤n에 대해, 칸 (i,i)(i, i)(i,i)에 111을 더한다.
  • 1≤j<k≤n1 \le j < k \le n1≤이고 이며 이 모두 와 다른 모든 에 대해, 칸 에서 을 뺀다.

이때, 구간 [l,r][l, r][l,r]의 서로 다른 수의 개수는 GGG의 영역 [l,n]×[1,r][l, n] \times [1, r][l,n]×[1,r]의 모든 수의 합과 같다. 증명은 다음과 같다.

먼저 (i,i)(i, i)(i,i) 꼴의 칸에 111을 더함으로써 생기는 영향은 r−l+1r-l+1r−l+1과 같다. 이는 구간 [l,r][l, r][l,에 있는 수의 개수와 같다. 하지만, 이때 같은 수가 여러 번 더해질 수 있으므로, 어떤 수 가 번 등장한다면, 만큼을 답에서 빼주어야 한다. 구간 에 가 번 등장하며 이라 하자. 등장하는 위치들을 오름차순으로 라 정의했을 때, 위의 격자 수정 규칙에 의해 칸 에 이 적혀 있어야 하며, 이 모든 칸들은 범위 내에 존재한다. 또한, 만약 인 에 의해 이 빼진 다른 격자칸들이 있다면, 해당 격자칸은 범위에 하나도 없음을 관찰할 수 있다. 따라서 값 에 의한 칸들의 총 기여량이 이 됨을 알 수 있고, 칸의 기여량과 상쇄되어 총 만큼의 기여를 하게 된다.

이제 원래 문제를 해결하는 방법을 알아보자. 두 번째 격자 수정 규칙을 다음과 같이 바꾼다.

  • 모든 1≤x≤n1 \le x \le n1≤x≤n에 대해, xxx가 vvv번 등장하며, 그 위치를 오름차순으로 i1,i2,…,ivi_1, i_2, \dots, i_vi라 하자. 인 모든 에 대해, 칸 에서 을 뺀다.

위 증명과 같은 논리를 적용하면, 범위 [l,n]×[1,r][l, n] \times [1, r][l,n]×[1,r]에서 −1-1−1 칸들에 의한 값 xxx의 기여량이 min⁡(cx−dx,0)\min(c_x-d_x, 0)임을 알 수 있다. (여기서 는 범위 에서 의 등장 횟수를 의미한다.) 칸이 총 만큼의 기여를 하므로, 두 기여를 더해 보면 값 의 합 기여량은 총 임을 알 수 있다. 따라서 위 풀이는 정당하다.

위 규칙으로 격자를 수정할 때, 격자 위에 000이 아닌 값을 가지는 칸이 최대 2n2n2n개이며, 이 칸들은 O(nlog⁡n)O(n \log n)O(nlogn) 전처리를 통해 구할 수 있다. 이후로는 2D에서 점들 O(n)O(n)O(n)개가 주어질 때, O(q)O(q)개의 직사각형 영역 합을 구하면 되고, 이는 오프라인 쿼리와 스위핑을 이용해 에 가능하다. 따라서, 전체 문제를 에 해결할 수 있다.

i
​
)
.
i
​
,
ri​
]
n×nn \times nn×n
GGG
rrr
ccc
(r,c)(r, c)(r,c)
000
j<
k≤
n
aj=aka_j = a_kaj​=ak​
aj+1,…,ak−1a_{j+1}, \dots, a_{k-1}aj+1​,…,ak−1​
aja_jaj​
(j,k)(j, k)(j,k)
(j,k)(j, k)(j,k)
111
r
]
xxx
vvv
max⁡(v−1,0)\max(v-1, 0)max(v−1,0)
[l,r][l, r][l,r]
xxx
vvv
v≥1v \ge 1v≥1
i1,…,ivi_1, \dots, i_vi1​,…,iv​
(i1,i2),(i2,i3),…,(iv−1,iv)(i_1, i_2), (i_2, i_3), \dots, (i_{v-1}, i_v)(i1​,i2​),(i2​,i3​),…,(iv−1​,iv​)
−1-1−1
[l,n]×[1,r][l, n] \times [1, r][l,n]×[1,r]
aj=ak=xa_j = a_k = xaj​=ak​=x
(j,k)(j, k)(j,k)
111
[l,n]×[1,r][l, n] \times [1, r][l,n]×[1,r]
xxx
−1-1−1
−(v−1)-(v-1)−(v−1)
+1+1+1
vvv
111
1
​
,
i2​
,
…
,
iv​
1≤j≤v−dx1 \le j \le v-d_x1≤j≤v−dx​
jjj
(ij,ij+dx)(i_j, i_{j+d_x})(ij​,ij+dx​​)
111
min(cx​−
dx​,0)
cxc_xcx​
[l,r][l, r][l,r]
xxx
+1+1+1
cxc_xcx​
xxx
min⁡(cx,dx)\min(c_x, d_x)min(cx​,dx​)
O(q)
O((n+q)log⁡n)O((n+q) \log n)O((n+q)logn)
O((n+q)log⁡n)O((n+q) \log n)O((n+q)logn)