[분할 트리 체인 [펜윅 트리] Luogu P3676 작은 신선한 데이터 구조 그

제목 설명

오래, 오래 전, 거대한 나무 n 개의 지점이 있었다, 각각의 점은 점에 권리가 있습니다.

Q 작업은 각 작업은 그들 각각의 권리 포인트와 제곱의 합 루트로하는 서브 트리에이 시점에서 물었을 때 포인트 또는 포인트가 오른쪽 지점을 지정 수정하는 것입니다있다.

(제목은 예를 설명 볼 수 있습니다 이해도 보이지 않았다, 이해하기 쉽지 않다)

 

문제 해결

 

코드

1 #INCLUDE <cstdio>
 2 #INCLUDE <CString을>
 3 #INCLUDE <iostream> 
 4  #DEFINE LL 긴 긴
 5  #DEFINE의 SQR (X) (X) * (X)
 6  이용한  스페이스 성병;
7  CONST LL = N + 2E5 (10) ; 
8  구조체 에지 {LL 에서 행;} E [N << 1 ];
9  줄게 N, m, CNT, ANS, TOT, SZ [N], 3 [N], FA [N], [N], ID [N] w, POS [N], 깊이 [N], 아들 [N ] 가기 [N], 헤드 [N] SZ1 [N] SZ2 [N];
(10)  보이드 추가 (LL의 X, LL의 Y) { 위해 ( int로 된 I =의 X를, 난 = N <; I + = I 및 (- I)) SZ1 [I] + = Y, SZ2의 [I] + = X *와이; }
 11 LL 쿼리 (LL X) {LL에서 R = 0 ;  (LL = I의 X, I, I-I 및 = (- I)) + (R) = (X + 1 ) * SZ1 [I] -sz2 [I]; 반환 R을; }
 12  무효 인서트 (LL의 X, Y의 LL)
 13  {
 14      E [++ CNT] .TO = Y, E [CNT].  = 헤드 [X], 헤드 [X] = CNT;
15      = X의 .TO E [++ CNT], E [CNT].  = 헤드 [Y], 헤드 [Y] = CNT;
16  }
 17  무효 dfs1 (LL X)
 18  {
 19      깊은 [X] = 깊은 [FA의 [X] + 1 , SZ [X] = 1 ;
(20)      에 대한(LL I = 헤드 [X] I]. I = E [I] 에서 ) 경우 (! E [I] .TO = FA [X])
 21      {
 22          FA [E [I]를 .TO =의 X, dfs1 (E [I] .TO) SZ [X] = + SZ [E [I] .TO], w [X] + = w [E [I] .TO];
23 일          경우 (SZ [E [I]를 .TO] "SZ [아들 [X]) 아들 [X] = E [I] .TO;
24      }
 25      ANS + = SQR (w [X]);
26  }
 27  무효 DFS2 (LL의 X, LL 사전)
 28  {
 29      가기 [X] = 프리; POS [ID [X] = ++ TOT =의 X, 추가 (ID [X], w [X] -w [ POS [tot- 1 ]);
30      의 경우 (SON [X])가 DFS2 (아들 [X], 사전);
31       I; (LL 헤드 I = [X] I = E [I]. ) 경우 ! (FA [X] = E [I] .TO && E [I] = .TO 아들 [X]) DFS2 (E [I] .TO, E [I] .TO);
32  }
 33  보이드는 (LL의 X, Y의 LL) 수정
 34  {
 35      LL에서 L = 0 , R = 0 ;
36       (; X, X = FA [가기 [X]) L + = ID [X] -id [가기 [X] + 1 , R + = 조회 (ID [X]) - 조회 (ID [가기 [X ]] - 1 ), [(X] + ID를 추가 (ID [가기 [X], y)를 추가  , - )를 Y;
37      ANS + = Y의 * (Y *의 리터 + (R << 1 ));
38  }
 39  LL CALC (LL U)
 40  {
 41      LL에서 K = 0 , X = 쿼리 (1 ) S = 0 ;
42       (, U, U = FA [가기 [U]) K + = ID [U] -id [가기 [유] + 1 , S + = 조회 (ID [U]) - 톱 조회 (ID [U ]] - 1 );
43      리턴 ANS + X * ((K + 1 ) * X- (S << 1 ));
44  }
 45  INT 의 main ()
 46  {
 47      는 scanf ( " %의 LLD의 %의 LLD " , N, m);
48       (LL I = 2 , X는, Y는, 난 <= N; 내가 ++) (scanf와를 " %의 LLD의 %의 LLD " , X를, (X, Y)를 삽입 Y);
49       (LL I = 1; 나는 <= N; I ++는)는 scanf를 ( " %의 LLD " , C [I]), w [I] =의 C [I];
50      dfs1 ( 1 ) DFS2 ( 1 , 1 );
51       (LL 연산, X, Y, m, M-- )
 52      {
 53          는 scanf ( " %의 LLD의 %의 LLD " , OP, X);
54          경우 (연산 == 1 )는 scanf ( " %의 LLD ' , Y)의 C = Y- [X], C [X] + = Y는, (X, Y)를 변경; 사람 의 printf ( " % LLD \ 없음 " , CALC (X));
55      }
 56 }

 

추천

출처www.cnblogs.com/Comfortable/p/11329275.html