ps:problems:boj:31395
목차
정렬된 연속한 부분수열의 개수
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 31395 |
문제명 | 정렬된 연속한 부분수열의 개수 |
레벨 | 실버 4 |
분류 |
조합론 |
시간복잡도 | O(n) |
인풋사이즈 | n<=200,000 |
사용한 언어 | Python 3.11 |
제출기록 | 55060KB / 116ms |
최고기록 | 104ms |
해결날짜 | 2024/02/05 |
풀이
- 어떤 증가하는 연속한 수열의 연속한 부분수열들은 모두 증가하는 부분배열이다. 즉, A[x:x+l]이 증가 수열이라면, x≤i<j≤x+l 인 모든 i,j에 대해서 A[i:j]는 증가 수열이다. 이러한 i,j 쌍의 개수는 comb(l+1,2) 이다
- 이제 원래 수열을 맥시멀한 연속된 증가수열들로 쪼개서, 각각의 수열마다 저 값들을 더해주면 된다.
- 실제 구현은 l을 다 구한 뒤에 comb를 계산하는 대신에, l이 늘어날때마다 l값을 더해주는 식으로 구현했지만, 기본 원리는 똑같다.
- 시간복잡도는 O(n)
코드
"""Solution code for "BOJ 31395. 정렬된 연속한 부분수열의 개수".
- Problem link: https://www.acmicpc.net/problem/31395
- Solution link: http://www.teferi.net/ps/problems/boj/31395
"""
import itertools
def main():
N = int(input()) # pylint: disable=unused-variable
A = [int(x) for x in input().split()]
answer = 1
inc_size = 1
for prev, cur in itertools.pairwise(A):
if prev < cur:
inc_size += 1
else:
inc_size = 1
answer += inc_size
print(answer)
if __name__ == '__main__':
main()
ps/problems/boj/31395.txt · 마지막으로 수정됨: 2024/02/05 14:18 저자 teferi
토론