페이지를 불러오는 중…
해결한 사람
1
명
정답률
100.00
%
시간 제한
200000
ms
메모리 제한
1024
MB
Sherlock과 Watson은 프로그래밍 수업에서 C++ 언어의 복잡한 세부 사항을 완전히 익혔으므로, 이제 알고리즘 문제로 넘어갔다. 오늘 수업에서 강사는 일차원 구간을 병합하는 문제를 소개했다. N개의 구간이 주어지며, i번째 구간은 양 끝점을 포함하는 끝점 [, ]로 정의된다. 여기서 ≤ .
강사는 구간 집합의 덮인 영역을 적어도 하나의 구간에 나타나는 정수의 개수로 정의했다. (엄밀히 말해, ≤ p ≤ 를 만족하는 어떤 j가 존재하면 정수 p는 덮인 영역에 기여한다.)
Watson은 언제나 Sherlock에게 도전하기를 좋아한다. 그는 남은 구간들의 덮인 영역이 최소가 되도록 정확히 하나의 구간을 제거하라고 Sherlock에게 요청했다. N개의 구간 중 정확히 하나를 제거한 뒤 가능한 덮인 영역의 최솟값을 Help Sherlock 구한다.
1 ≤ T ≤ 50. 메모리 제한: 1GB. 0 ≤ ≤ ≤ . 0 ≤ A ≤ . 0 ≤ B ≤ . 0 ≤ ≤ . 0 ≤ ≤ . 1 ≤ M ≤ .
시간 제한: 30초. 1 ≤ N ≤ 1000.
시간 제한: 200초. 1 ≤ N ≤ 5 * (500000).
각 테스트 케이스는 여덟 개의 정수 N, , , A, B, , , M이 있는 한 줄로 구성된다. N은 구간의 개수이며, 나머지 일곱 값은 다음과 같이 다른 구간들을 생성하는 데 사용해야 하는 매개변수이다.
먼저 x_{1} = 및 y_{1} = 로 정의한다. 그런 다음 아래의 점화식을 사용하여 i = 2부터 N까지 x_{i}, y_{i}를 생성한다.
x_{i} = ( A*x_{i-1} + B*y_{i-1} + )을 M으로 나눈 나머지.
y_{i} = ( A*y_{i-1} + B*x_{i-1} + )을 M으로 나눈 나머지. 모든 i = 2부터 N까지에 대해 = min(x_{i}, y_{i}) 및 = max(x_{i}, y_{i})로 정의한다.
각 테스트 케이스마다 Case #x: y를 포함하는 한 줄을 출력한다. 여기서 x는 테스트 케이스 번호이며(1부터 시작), y는 정확히 하나의 구간을 제거한 뒤 남은 모든 구간의 가능한 덮인 영역의 최솟값이다.
3
1 1 1 1 1 1 1 1
3 2 5 1 2 3 4 10
4 3 4 3 3 8 10 10
Case #1: 0
Case #2: 4
Case #3: 9
케이스 1에서 생성 방법을 사용해 생성된 구간의 집합은 다음과 같다. {}. 유일한 구간을 제거하면 덮인 영역은 0이다.
케이스 2에서 생성 방법을 사용해 생성된 구간의 집합은 다음과 같다. {, , }. 첫 번째, 두 번째 또는 세 번째 구간을 제거하면 남은 구간의 덮인 영역은 각각 5, 6, 4가 된다.
케이스 3에서 생성 방법을 사용해 생성된 구간의 집합은 다음과 같다. {, , , }. 첫 번째, 두 번째, 세 번째 또는 네 번째 구간을 제거하면 남은 구간의 덮인 영역은 각각 10, 9, 9, 10이 된다.
Copyright Google LLC; sourced from the Google Coding Competitions Archive.
로그인 상태를 확인하는 중입니다.