사용자 도구

사이트 도구


ps:problems:boj:19086

Leave Out All The Rest

ps
링크acmicpc.net/…
출처BOJ
문제 번호19086
문제명Leave Out All The Rest
레벨골드 1
분류

LIS

시간복잡도O(nlogn + mlogm)
인풋사이즈n<=500,000, m<=500,000
사용한 언어Python 3.13
제출기록114804KB / 524ms
최고기록524ms
해결날짜2026/01/19

풀이

  • merge된 수열의 LIS의 길이의 최댓값은 {a의 LIS의 길이} + {b의 LIS의 길이}임은 자명하다
  • 그리고, a의 LIS와 b의 LIS를 잘 merge 하면, 정렬된 상태의 수열을 얻을 수 있다. 즉, a와 b를 merge할때, a의 LIS와 b의 LIS가 정렬된 상태가 되도록 merge해주기만 하면, 머지된 수열의 LIS 길이가 {a의 LIS의 길이} + {b의 LIS의 길이}가 되도록 만들수 있다.
  • 결국, 답은 {a의 LIS의 길이} + {b의 LIS의 길이}가 되고, 각각의 LIS를 구하는 O(nlogn + mlogm)이 총 시간복잡도가 된다.
  • 만약, a와 b에 겹치는 원소들이 있고, 만들어야 하는 것이 strictly increasing subsequence 였다면 문제가 복잡해졌을텐데, 문제 조건에서 a와 b에 겹치는 원소들이 없다고 주어졌으므로 이것으로 충분히 풀린다.

코드

"""Solution code for "BOJ 19086. Leave Out All The Rest".

- Problem link: https://www.acmicpc.net/problem/19086
- Solution link: http://www.teferi.net/ps/problems/boj/19086

Tags: [lis]
"""

from teflib import seqtask


def main():
    _n = int(input())
    a = [int(x) for x in input().split()]
    _m = int(input())
    b = [int(x) for x in input().split()]

    lis_len_a = seqtask.longest_inc_subseq_length(a)
    lis_len_b = seqtask.longest_inc_subseq_length(b)

    print(lis_len_a + lis_len_b)


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
B B P J G
 
ps/problems/boj/19086.txt · 마지막으로 수정됨: 2026/01/19 14:36 저자 teferi