-
[ABC038 C] 単調増加문제 풀이/AtCoder 2023. 1. 30. 16:35
난이도: 894 // 실험적
번역
더보기\( N \)개의 정수가 주어집니다. \( i \)번째 수는 \( a_{i} \)입니다.
\( l \le r \)이면서 \( a_{l}, a_{l+1}, \ldots, a_{r} \)이 증가수열이 되도록 하는 \( (l, r) \)의 개수를 찾으세요.
즉, \( l \le i < r \)인 모든 \( i \)에 대해 \( a_{i} < a_{i+1} \)를 만족시키는 \( (l, r) \)의 개수를 찾으세요.
태그
더보기- Sweeping (스위핑)
풀이
1. \( l \)을 고정시킬 때, 가능한 개수는?
더보기조건의 특성상, \( r_1 < r_2 \)이고 \( (l, r_2) \)가 증가수열이었다면, \( (l, r_1) \)도 증가수열이 됩니다.
또한, \( r_1 < r_2 \)이고 \( (l, r_1) \)이 증가수열이 아니라면, \( (l, r_2) \)도 증가수열이 아니게 됩니다.
이제, \( r \)을 \( l \)에서부터 시작해서 오른쪽으로 한 칸씩 이동해봅시다.
그럼, \( r \)은 \( a_{r} \ge a_{r+1} \)을 만나게 되거나, \( N \)번째 수까지 이동하게 됩니다.
\( r \)이 멈추게 되면, 어떤 특정한 \( l \)에 대해 증가수열을 만들게 되는 \( r \)의 끝점을 알게 되고,
시작점은 자명히 \( r = l \)일테니, 가능한 경우는 \( r-l+1 \)가지가 됨을 알 수 있습니다.
2. 더 빠르게 구해보기
더보기(1번)의 방식대로만 돌리면, \( O(N^2) \)의 시간이 나오게 됩니다.
하지만, \( l \)을 \( N \)부터 한 칸씩 왼쪽으로 이동시키면, 이로 인한 \( r \)의 위치는 아래 둘 중 하나로 고정됩니다.
- \( a_{l} < a_{l+1} \): \( r \)의 위치에 변함이 없습니다. \( a_{l} < a_{l+1} \) 다음의 비교는 \( l+1 \)에서 한 비교와 동일할테니까요.
- \( a_{l} \ge a_{l+1} \): \( r \)의 끝점이 \( l \)로 이동합니다. 첫 비교부터 증가수열이 아니라는 결론이 나왔으니까요.
다르게 말하자면, \( l \)을 \( N \)에서부터 왼쪽으로 이동시키면, 새로운 \( r \)의 위치를 \( O(1) \)에 계산할 수 있게 됩니다.
코드
'문제 풀이 > AtCoder' 카테고리의 다른 글
[ABC006 D] トランプ挿入ソート (0) 2023.01.30 [ABC213 E] Stronger Takahashi (0) 2023.01.30 [ABC226 C] Martial artist (0) 2023.01.30 [AGC030 A] Poisonous Cookies (0) 2023.01.30 [ARC119 A] 119 × 2^23 + 1 (0) 2023.01.30