https://www.acmicpc.net/problem/20617
요약: 1,2,3으로 이루어진 길이 n≤106의 수열 a와 길이 m≤106의 수열 b 의 Longest Common Increasing Subsequence (LCIS) 를 구하라.
편의상 m=n이라 하겠다.
만약 수열이 1,2로만 이루어졌다면 어떨까? SAx(l,r)을 a의 구간 [l,r]에서 x의 개수라 하자. SBx(l,r)도 비슷하게 정의하자. a에선 구간 [1,ia]에서 1만을, 구간 [ia+1,n]에서 2만을 선택하고, b에선 구간 [1,ib]에서 1만을, 구간 [ib+1,n]에서 2만을 선택하는 모든 경우에 대해 답을 구해보자. 그럼 식은 다음과 같다.
max1≤ia≤n,1≤ib≤nmin{SA1(1,ia),SB1(1,ib)}+min{SA1(ia+1,n),SB1(ib+1,n)}. 하지만 이 식을 계산하는 데에는 O(n2)이 걸린다.
이때 어떤 LCIS에 대해, 1들을 각 수열마다 앞에서부터 선택해줘도 된다는 점을 관찰하면, a와 b에서 같은 개수의 1을 선택한 경우에 대해서만 위 식을 계산해줘도 됨을 알 수 있다. 다음과 같은 집합 idx={(ia,ib)|aia=bib=x,SAx(1,ia)=SBx(1,ib)}에 대해, max(ia,ib)∈id1SA1(1,ia)+min{SA1(ia+1,n),SB1(ib+1,n)} 은 O(n)에 계산해줄 수 있다.
이제 다시 원문제로 돌아와서, 1,2,3으로 이루어진 수열에 대해 생각해보자. 비슷하게 각 수열마다 앞에서부터 차례대로 1,2,3을 고르고 min을 취해주는 식을 생각해볼 수 있지만, O(n2)을 O(n)으로 줄인 관찰과 비슷하게 1을 앞에서부터 같은 개수로 선택해주고, 2를 그 앞에서부터 다시 같은 개수로 취해주는 경우에 대해 생각해보면, 다음과 같은 식이 나온다. max(ia,ib)∈id1{SA1(1,ia)+max(ja,jb)∈id2,ja>ia,jb>ib{SA2(ia+1,ja)+min{SA3(ja+1,n),SB3(jb+1,n)}}}
이 식을 제곱 미만에 계산하려면 어떻게 해야할까? SA3(ja+1,n)이 언제 min값이 되는지, 즉 각 i에 대해 SA3(i,n)≤SB3(j,n)인 j들은 어떤 값들일지 생각해보자. SB3(j,n) 는 j가 증가함에 따라 값이 단조감소함을 생각해보면, 각 i에 대해 j는 [1,ri]형태의 연속적인 구간 또는 공집합이 될 것이다. 그럼 다시 답을 구하는 식으로 돌아와서, ri들을 전처리 하였다면 jb+1≤rja인 ja들에 대해 max 쿼리를 날려주면 됨을 알 수 있다. 추가적으로 ja>ia도 만족해야 하기에, 2차원 쿼리가 될 것이고, 이는 스위핑과 세그먼트 트리를 사용하면 오프라인 쿼리로 처리해줄 수 있다. 비슷하게 SB3(jb+1,n)이 언제 최솟값이 되는지에 대해 생각하며 이도 처리해주면 문제를 해결할 수 있다.
최종 시간복잡도는 O(nlogn)이 된다.
'알고리즘' 카테고리의 다른 글
백준 8193 킹세종 (POI 2009/2010 stage 2 Teleportation) (3) | 2025.03.09 |
---|---|
알고리즘 / 코딩테스트 과외 합니다 (0) | 2025.02.28 |
BOJ32766 색깔 사각형과 쿼리 (0) | 2024.11.26 |
오프 향유회 후기 (0) | 2024.09.01 |
MDMTSP(814-3) 정리 (1) | 2024.08.26 |