아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

가변 부분수열

시간 제한2초메모리 제한512 MB

요약
이웃한 두 항이 항상 다른 부분수열을 위치 집합 기준으로 셈하는 문제다.
난이도

보통10점 중 7점

유형
동적 계획법, 조합론, 배열
정답자
아직 제출이 없습니다

문제

수열 a=(a1,a2,…,an)a = (a_1, a_2, \dots, a_n) 이 주어진다. 수열의 부분수열은 원래 수열에서 임의 개수(0개일 수도 있다)의 항을 제거해 얻는 수열이다. 즉 1≤i1<i2<⋯<ik≤n1 \le i_1 < i_2 < \dots < i_k \le n 을 만족하는 첨자들에 대해 (ai1,ai2,…,aik)(a_{i_1}, a_{i_2}, \dots, a_{i_k}) 형태로 쓸 수 있는 수열을 뜻한다.

가변 부분수열은 인접한 두 항이 항상 서로 다른 부분수열이다. 예를 들어 (1,3,1,2)(1, 3, 1, 2) 는 (1,2,3,1,3,2,2)(1, 2, 3, 1, 3, 2, 2) 의 가변 부분수열이다.

주어진 수열에서 공집합이 아니면서 서로 다른 가변 부분수열이 몇 개인지 구하자. 두 부분수열은 대응하는 위치(첨자) 집합이 서로 다르면 다른 것으로 센다. 예컨대 (1,2,3,1,3,2,2)(1, 2, 3, 1, 3, 2, 2) 에는 (1,3,1,2)(1, 3, 1, 2) 형태의 가변 부분수열이 서로 다른 두 가지 존재한다.

입력

첫째 줄에 수열 aa 의 길이 nn (2≤n≤500,0002 \le n \le 500{,}000) 이 주어진다. 둘째 줄에 nn 개의 정수 aia_i (1≤ai≤500,0001 \le a_i \le 500{,}000) 가 공백으로 구분되어 주어진다.

출력

공집합이 아닌 가변 부분수열의 개수를 109+710^9 + 7 로 나눈 나머지를 첫째 줄에 출력한다.

힌트

수열 (1,2,1,1)(1, 2, 1, 1) 에서 세는 가변 부분수열은 다음과 같다.

  • (1)(1): 세 번 (1번, 3번, 4번 위치)
  • (2)(2): 한 번
  • (1,2)(1, 2): 한 번
  • (2,1)(2, 1): 두 번
  • (1,2,1)(1, 2, 1): 두 번

따라서 모두 3+1+1+2+2=93 + 1 + 1 + 2 + 2 = 9 가지이다.

예제3

  1. 예제 1

    입력
    4
    1 2 1 1
    
    예상 출력
    9
    
  2. 예제 2

    입력
    2
    5 5
    
    예상 출력
    2
    
  3. 예제 3

    입력
    2
    3 7
    
    예상 출력
    3