시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 1024 MB | 14 | 10 | 7 | 87.500% |
기업 KDH에서는 $N$개의 회의를 매일 진행한다. 회의에는 0부터 $N - 1$까지의 번호가 붙어져 있으며 모든 $0 \le i \le N - 1$에 대해 $i$번 회의는 시각 $S[i]$에 시작해 시각 $E[i]$에 끝난다.
KDH에서 회의를 여는 방식은 특별하다. 어떤 날에 진행되는 서로 다른 회의 $i$와 $j$가 다음 조건 중 적어도 하나를 만족하면 두 회의는 해당 날에 서로 관련있는 회의라고 부른다:
두 회의 $i$와 $j$가 서로 관련있는 회의가 아니라면 두 회의는 해당 날에 서로 관련없는 회의라고 부른다.
KDH는 매일 회의를 진행할 때 각 회의를 특정 회의실에 배정하여 진행한다. 이 때, 해당 날에 서로 관련없는 회의가 같은 회의실에 배정되지 않아야 한다. KDH에서는 이러한 조건을 만족하는 배정 방법들 중 필요한 회의실의 수가 최소인 방법을 선택할 것이다. 이러한 배정에서 필요한 최소 회의실의 수를 회의들의 비용이라고 하자.
KDH는 현재 회의들에 불필요하게 많은 자원이 소모된다고 판단해 회의의 수를 단 하나로 줄이기로 결정하였다. 이를 위해, KDH는 $N - 1$일에 걸쳐 매일 다음과 같은 작업을 반복한다:
이 과정이 모두 끝나게 되면 단 하나의 회의를 제외하고 모든 회의가 취소된다. 마지막에 남는 회의가 무엇인지는 상관 없다.
KDH는 더욱 비용을 절감하기 위해 여러 방법들 중 $N - 1$일 동안 각 날에 필요한 비용의 합이 최소인 방법을 선택하려고 한다. 당신은 KDH를 위해 이러한 방법이 얼마나 존재하는지 구해야 한다. 두 방법이 같다는 것은, 각 날에 취소하기로 선택한 회의들이 모두 같다는 것을 뜻한다: 구체적으로, $N - 1$일에 걸쳐 취소하기로 선택한 회의가 모두 같을 경우, 회의실에 남은 회의들을 배정하는 방법이 다르더라도 이는 같은 경우로 간주한다. 단, 방법의 수가 매우 커질 수 있으므로 소수 $1\,000\,000\,007$로 나눈 나머지를 구해야 한다.
여러분은 아래 함수를 구현해야 한다.
int count_removals(vector<int> S, vector<int> E)
제출하는 소스 코드의 어느 부분에서도 입출력 함수를 실행해서는 안 된다.
$N = 4$, $S = [1, 3, 5, 7]$, $E = [2, 4, 6, 8]$인 경우를 생각해 보자.
그레이더는 다음과 같이 함수를 호출한다.
count_removals([1, 3, 5, 7], [2, 4, 6, 8])
아래 그림은 각 회의가 진행되는 시간을 나타낸다.
어떠한 방법으로 진행하지 않을 회의를 정하더라도 각 날에 필요한 회의실의 수, 즉 비용이 순서대로 3, 2, 1로 같고, 모든 날에 필요한 비용의 합도 6으로 같다. 따라서 모든 방법이 가능한 방법이다.
함수는 $24$를 반환해야 한다.
$N = 10$, $S = [1, 2, 4, 6, 8, 10, 12, 14, 16, 18]$, $E = [5, 3, 7, 11, 9, 15, 13, 20, 17, 19]$인 경우를 생각해 보자.
그레이더는 다음과 같이 함수를 호출한다.
count_removals([1, 2, 4, 6, 8, 10, 12, 14, 16, 18], [5, 3, 7, 11, 9, 15, 13, 20, 17, 19])
아래 그림은 각 회의가 진행되는 시간을 나타낸다.
함수는 $13280$을 반환해야 한다.
$N = 10$, $S = [1, 2, 3, 5, 6, 10, 11, 12, 14, 18]$, $E = [20, 9, 4, 8, 7, 17, 16, 13, 15, 19]$인 경우를 생각해 보자.
그레이더는 다음과 같이 함수를 호출한다.
count_removals([1, 2, 3, 5, 6, 10, 11, 12, 14, 18], [20, 9, 4, 8, 7, 17, 16, 13, 15, 19])
아래 그림은 각 회의가 진행되는 시간을 나타낸다.
함수는 $845040$을 반환해야 한다.
$N = 10$, $S = [1, 2, 3, 4, 6, 7, 8, 11, 13, 15]$, $E = [5, 9, 10, 12, 14, 16, 17, 18, 19, 20]$인 경우를 생각해 보자.
그레이더는 다음과 같이 함수를 호출한다.
count_removals([1, 2, 3, 4, 6, 7, 8, 11, 13, 15], [5, 9, 10, 12, 14, 16, 17, 18, 19, 20])
아래 그림은 각 회의가 진행되는 시간을 나타낸다.
함수는 $1797408$을 반환해야 한다.
$N = 10$, $S = [12, 5, 10, 2, 4, 17, 8, 1, 14, 9]$, $E = [16, 7, 19, 3, 6, 20, 11, 15, 18, 13]$인 경우를 생각해 보자.
그레이더는 다음과 같이 함수를 호출한다.
count_removals([12, 5, 10, 2, 4, 17, 8, 1, 14, 9], [16, 7, 19, 3, 6, 20, 11, 15, 18, 13])
아래 그림은 각 회의가 진행되는 시간을 나타낸다.
함수는 $647760$을 반환해야 한다.
Sample grader는 아래와 같은 형식으로 입력을 받는다.
Sample grader는 다음을 출력한다.
count_removals
가 반환한 값Sample grader는 실제 채점에서 사용하는 그레이더와 다를 수 있음에 유의하라.
Olympiad > 국제정보올림피아드 대표학생 선발고사 > 2023 > 2차 선발고사 2번
C++17, C++20, C++17 (Clang), C++20 (Clang)