제목 설명
오래, 오래 전, 거대한 나무 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 }