만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

두 스택

면접 대비

시간 제한1초메모리 제한1024 MB

요약
두 가방의 맨 위 물건을 합쳐 최대 K개까지 뺄 때, 남은 두 가방 중 무거운 쪽의 무게를 가장 작게 만드는 값을 구합니다.
난이도

보통10점 중 5점

유형
누적 합, 투 포인터, 이분 탐색
정답자
아직 제출이 없습니다

문제

승형이와 원빈이는 배낭여행을 가기 위해 배낭을 하나씩 준비했다. 두 배낭에는 각각 NN개의 물건이 들어 있다.

  • 첫 번째 배낭에는 무게가 A1,A2,…,ANA_1, A_2, \dots, A_N인 물건이 아래에서 위로 쌓여 있다. ANA_N이 맨 위 물건의 무게이다.
  • 두 번째 배낭에는 무게가 B1,B2,…,BNB_1, B_2, \dots, B_N인 물건이 아래에서 위로 쌓여 있다. BNB_N이 맨 위 물건의 무게이다.

배낭의 무게는 배낭 안에 남은 물건 무게의 합이다. 원빈이는 두 배낭 중 하나를 골라 맨 위 물건을 없앨 수 있으며, 이 작업은 최대 KK번까지 할 수 있다. 물건을 없애면 고른 배낭의 무게가 그 물건의 무게만큼 줄어든다. 고른 배낭에 물건이 하나도 없으면 아무 일도 일어나지 않는다.

원빈이의 작업이 모두 끝나면 승형이가 멜 배낭을 정한다. 승형이는 약삭빠르기 때문에 항상 두 배낭 중 더 가벼운 쪽을 멘다. 두 배낭의 무게가 같으면 둘 중 아무거나 멘다. 원빈이는 승형이가 메지 않은 배낭을 들어야 한다.

원빈이가 들어야 하는 배낭 무게의 최솟값을 구하라.

입력

첫 줄에 정수 NN과 KK가 주어진다. (1≤N≤105,0≤K≤2N)(1 \leq N \leq 10^5, 0 \leq K \leq 2N)

둘째 줄에 첫 번째 배낭 물건들의 무게 A1,A2,…,ANA_1, A_2, \dots, A_N이 주어진다. (1≤Ai≤109)(1 \leq A_i \leq 10^9)

셋째 줄에 두 번째 배낭 물건들의 무게 B1,B2,…,BNB_1, B_2, \dots, B_N이 주어진다. (1≤Bi≤109)(1 \leq B_i \leq 10^9)

출력

원빈이가 들어야 하는 배낭 무게의 최솟값을 출력한다.

힌트

이 문제는 입력 데이터의 용량이 커서, 시간 초과를 받지 않으려면 빠른 입출력 방법을 써야 할 수도 있다.

  • C++에서 cin과 cout을 쓰려면:

    • main 함수 맨 위에 cin.tie(nullptr)와 ios::sync_with_stdio(false)를 적는다.
    • endl 대신 개행 문자(\n)를 쓴다.
    • 이 방식을 쓰면 scanf, printf, puts, getchar, putchar 같은 C의 입출력 함수를 쓰면 안 된다.
  • Java를 쓴다면:

    • Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 쓴다.
    • 마지막에 BufferedWriter.flush를 한 번 호출한다.
  • Python을 쓴다면:

    • input 대신 sys.stdin.readline을 쓴다. 이 함수는 맨 끝의 개행 문자까지 함께 입력받는다.
    • 개행 문자를 뺀 문자열을 저장하고 싶다면 .rstrip()을 붙이는 것이 좋다.

예제2

  1. 예제 1

    입력
    3 2
    3 1 4
    1 5 9
    
    예상 출력
    6
    
  2. 예제 2

    입력
    3 0
    3 1 4
    1 5 9
    
    예상 출력
    15