만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

레코드와 안티레코드

시간 제한3초메모리 제한1024 MB

요약
순열을 공집합이 아닌 두 부분수열로 나눠, 첫 번째 수열의 기록 개수와 두 번째 수열의 역기록 개수 합의 최댓값을 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 세그먼트 트리, 그리디
정답자
아직 제출이 없습니다

문제

크기가 nn인 순열은 11부터 nn까지의 모든 값이 정확히 한 번씩 나타나는 정수 수열 a1,a2,…,ana_1, a_2, \ldots, a_n이다.

수열 b1,b2,…,blb_1, b_2, \ldots, b_l은 aa에서 일부 원소를 지워서 얻을 수 있으면 aa의 부분수열이다. 즉 l≤nl \le n이고, ait=bta_{i_t} = b_t를 만족하는 인덱스 i1<i2<…<ili_1 < i_2 < \ldots < i_l이 존재한다.

  • 원소 aia_i가 자신보다 앞에 있는 모든 원소보다 엄격히 크면 레코드이다. 즉 1≤j<i1 \le j < i인 모든 jj에 대해 aj<aia_j < a_i이다.
  • 원소 aia_i가 자신보다 앞에 있는 모든 원소보다 엄격히 작으면 안티레코드이다. 즉 1≤j<i1 \le j < i인 모든 jj에 대해 aj>aia_j > a_i이다.

순열 p1,p2,…,pnp_1, p_2, \ldots, p_n이 주어진다. pp를 비어 있지 않은 두 부분수열 qq와 rr로 나눈다. pp의 각 원소는 둘 중 정확히 하나에 속한다. qq의 레코드 개수와 rr의 안티레코드 개수의 합을 최대화한다.

입력

첫 줄에 테스트 케이스의 수 tt (1≤t≤100 0001 \le t \le 100\,000)가 주어진다. 각 테스트 케이스는 두 줄로 이루어진다.

첫 줄에는 순열의 크기 nn (2≤n≤200 0002 \le n \le 200\,000)이 주어진다. 둘째 줄에는 순열 p1,p2,…,pnp_1, p_2, \ldots, p_n이 주어진다. 11부터 nn까지의 각 수는 정확히 한 번씩 나타난다.

모든 테스트 케이스의 nn을 합하면 200 000200\,000을 넘지 않는다.

출력

각 테스트 케이스마다 한 줄에 정수 하나를 출력한다. 최적으로 나눴을 때 qq의 레코드 개수와 rr의 안티레코드 개수의 합의 최댓값이다.

힌트

첫 번째 테스트 케이스에서 최적으로 나누는 방법 중 하나는 다음과 같다. 박스로 표시한 원소가 qq의 레코드이거나 rr의 안티레코드이다.

  • q=1 2 3 5q = \boxed{1}\ \boxed{2}\ \boxed{3}\ \boxed{5}
  • r=4r = \boxed{4}

두 번째 테스트 케이스에서 최적으로 나누는 방법 중 하나는 다음과 같다.

  • q=3 8 4 1 2 9q = \boxed{3}\ \boxed{8}\ 4\ 1\ 2\ \boxed{9}
  • r=10 7 5 6r = \boxed{10}\ \boxed{7}\ \boxed{5}\ 6

예제1

  1. 예제 1

    입력
    4
    5
    4 1 2 3 5
    10
    3 8 10 4 1 2 7 9 5 6
    3
    1 2 3
    6
    4 2 5 1 6 3
    
    예상 출력
    5
    6
    3
    5