서브 시퀀스의 모든 접두사 합계를 확인하는 동적 데이터 구조는>= 0이고 합계는= 0입니다.

cs.stackexchange https://cs.stackexchange.com/questions/119167

문제

요소가 $-1,0,1 $ 인 순서를 고려할 수 있습니다.


SubSiscence $ a [i ... j] $ $ good $ $= 0 $ .


예 : 시퀀스 $ 1,1,0, -1, -1,1 $ 아래 서브 시퀀스 $ 1,0, -1, -1,1 $ $ good $ 입니다.



subsisence $ a [i ... j] $ $ supergood $ 이면 좋고 모든 것 접두사 - 합계는 $>= 0 $
예 : 시퀀스 $ 1,1,0, -1, -1,1 $ 아래 서브 시퀀스 $ 1,0, -1, -1,1 $ $ supergood $ 이 아니라 $ 1,0, -1 $ $ supergood $ 입니다.

이제는 이러한 작업을 효율적으로 수행 할 수있는 동적 데이터 구조를 갖고 싶습니다.

  • insert (s, x, i) - $ x $ $ s $ 에 삽입 < SPAN CLASS="수학 용기"> $ i $ '의 위치
  • 제거 (S, I) - $ I $ 'TH 요소
  • 제거
  • issupergood (s, i, j) - 아래의 $ i $ , $ j $ supergood
  • 입니다

해결책은 왼쪽 및 오른쪽 하위 트리의 요소 합계를 가진 AVL 트리 일 수 있습니다. 업데이트가 쉽고 $ O (\ log (n)) $ :

에 쉽게 확인할 수 있습니다.

  1. 노드 찾기 i (v) $ \ o (\ log (n)) $
  2. 노드 J 찾기 (u를 u) $ \ o (\ log (n)) $
  3. v.val + v.lsum - u.lsum== 0 $ \ o (1) $
  4. 그러나 Supergood 조건을 확인하는 경우 방법을 보지 못합니다.

도움이 되었습니까?

해결책

각 하위 트리에 대해 트리를 저장하도록 하위 트리의 접두사 합계의 최소값은 해당 하위 트리의 요소 순서의 합계를 저장합니다. 그런 다음 $ o (\ log n) $ 시간에 슈퍼 가드 조건을 확인할 수 있습니다. 그것은 당신의 운동입니다. 그래서 당신이 세부 사항을 잘 해결하게 할 것입니다.

힌트 # 1 : 모든 접두사는 $ o (\ log n) $ 하위 트리의 조합으로 분해 될 수 있습니다.

힌트 # 2 : $ [x_1, \ dots, x_k] $ 은 (a) 최소값의 최소값입니다. $ [x_1, \ dots, x_j] $ , (b) $의 합계의 접두사 합계 [x_1, \ dots, x_j] $ $ [x_ {j + 1}, \ dots, x_k] $ . 이제 $ [x_1, \ dots, x_j] $ 은 노드의 왼쪽 하위 트리의 요소와 $ [ x_ {j + 1}, \ dots, x_k] $ 노드의 요소와 오른쪽 하위 트리의 요소의 요소를 사용하면 증강 된 값이 주어진 노드의 증강 된 값을 해당 구성 요소에 저장하는 방법을 제공합니다. 두 자녀.


일반적으로 확대 된 전형적인 전략은 증강 된 값을 선택하여 노드의 증강 값을 효율적으로 업데이트하거나 다시 컴파트 할 수 있도록 (일반적으로 $ o (1) $ 시간)과 2 자녀의 증강 된 값을 감안할 때, (2) 쿼리를 효율적으로 답변 할 수 있습니다 (일반적으로 $ o (\ Augmented 값을 사용하여 $ 시간을 사용하십시오. 종종 우리는 연속적인 값의 모든 간격이 $ o (\ log n) $ 하위 트리의 분리 된 연합으로 분해 될 수 있다는 사실을 종종 (2) 해결함으로써 (2) 처리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top