문제 링크: https://www.acmicpc.net/problem/1059
문제 설명이 좀 헷갈릴 수 있습니다. Lucky? Unlucky? Set? 구간?... 혼란스럽습니다.
푸는방법은 이분탐색인데 이런식으로 Lucky set의 원소 a_i와 a_i+1 사이에 N이 있다고 해봅시다. 이때 N이 L 또는 R과 같으면 답이 없으니 0입니다.
N을 포함한 연속된 범위를 만들려면 어떻게 해야 할까요. 빨간색 범위 [L+1, N] 뒤에서부터 0, 1, ..., N-L-1개를 고르고, 초록색 범위 [N, R-1] 앞에서부터 0, 1, ..., R-N-1개를 고르면 됩니다. 둘은 독립이므로 전체 경우의 수는 (R-N)*(N-L), 이때 둘 다 0개를 선택하면 [N, N]으로 이건 안되니까 1을 빼주면 답은 (R-N)*(N-L)-1이 됩니다.
예외가 있는데, Lucky Set의 최솟값이 N보다 큰 경우 위 그림에서 L=0인 경우라 생각하면 됩니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int L;
cin >> L;
set<int> s;
for (int i = 0; i < L; ++i) {
int in;
cin >> in;
s.insert(in);
}
int N;
cin >> N;
if (*s.lower_bound(N) == N) {
cout << 0 << '\n';
return 0;
}
auto left = s.lower_bound(N);
auto right = s.upper_bound(N);
if (left != s.begin()) {
left = prev(s.lower_bound(N));
cout << (*right - N) * (N - *left) - 1 << '\n';
}
else
cout << (*right - N) * N - 1 << '\n';
return 0;
}
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 9935: 문자열 폭발 (0) | 2020.07.27 |
---|---|
[백준][C++] 2468: 안전 영역 (0) | 2020.07.26 |
[백준][C++] 1629: 곱셈 (0) | 2020.07.26 |
[백준][C++] 5446: 용량 부족 (0) | 2020.07.25 |
[백준][C++] 1504: 특정한 최단 경로 (0) | 2020.07.25 |