NOIP 시뮬레이션 (25)을 테스트

폭발 뒤에 시험 정신. . . 나는 T2의 단지 2 시간 급하게 속임수 포인트라고, 멀리 false의 발생됩니다 발견

T1과는 m = 0의 탐색 할

주로 많은으로 나누어, T3를 할 첫 번째는 일부는 언뜻 87 분 (블라인드)이 있었다는 것을 발견했다.

나중에 생각은, 69 점을 체인을 느끼지 않는다

2.6s를 실행 발견 된 두 번째 테스트 조금 큰 샘플, 69 포인트의 코드 후, 폭발의 정신은 47 득점 것으로 예상된다

22 포인트, 69 포인트를 얻을 수있는 4000 포인트 후.

rk3에 T3 군웅와 그래서 성공

T1.

  포함 및 제외 밖에 생각하지 않은 시험의 생각 포함 - 배제를 발견하는 방법에 대해 생각 된 시험에서 좋은 질문입니다.

  정답은 포함 배제 에지이다.

T2.

  오일러

T3.

  컷 69 점으로 0.5 시간, 완전히 아이디어와 긍정적 인 솔루션을 다른 시험, 말을 좋아합니다.

  얼굴 형과 긍정적 인 솔루션은 전체 방정식의 해결은, 사실,이 공식은 두 나무 사이의 거리의 제곱이며, 그래서 우리는 대답 각 지점의 기여도를 고려할 수 단순화하는 것입니다.

  아들의 대답에 아버지 전송하는 방법 트리 DP를 고려

  우리는 알이 [I] 모든 포인트 나 거리를 서브 트리를 나타내고, ANS [I]의 제곱의 합, SIZ [I]가 승, 하위 트리의 크기를 나타낸다에서 I에 서브 트리 모든 지점을 의미 할 [I] 아버지에서 난을 나타냅니다.

  그런 다음이

  세 [전] + = 년 [I] + 2 * A [I] * W [I] + w [i]는 * W [I] * SIZ [Y]

 에서 [FA] + =에서 [I]에서 SIZ + [I] * W [i]를

 그래서 우리는 [1], 우리는 우리가 O (N)의 복잡도 솔루션을 찾을 수 있으며, 상기 식에 의해 루트를 변경할 수있다 ans와 주문

  O (NQ), 큰 정수의 총 복잡도는 코드 달성하기 매우 간단하다.

  

1 #INCLUDE <. 비트 / stdc ++ H>
 2  #DEFINE 개조 1,000,000,007
 3  #DEFINE 줄게 긴 길이
 4  이용한  스페이스 성병;
5  인라인 판독 LL () {
 6      INT (X) = 0 ;
7       CH = getchar가 ();
8      동안 (CH2 < ' 0 ' || CH> ' 9 ' ) CH = getchar가 ();
9 일      동안 (CH2> = ' 0 ' && CH <=에서 ' 9 ' ) (X) = (X << 3 ) + (X <<1 ) + CH- 48 , CH = getchar가 ();
10      창은 X;
11  }
 12  INT의 N [F 100005 ], 인터넷 [ 100005 ], [ 100005 ], 그래서 [ 100005 ], TOT, SB, Q;
13 LL의 SIZ [ 100005 ] 등 [ 100005 ], 팽 [ 100005 ] ANS, NI, [w 100005 ];
14 인라인 공극 추가 ( INT의 X, INT의 Y) {
 15      NE [++ TOT = Fi를 [X];
16      파이 [X]는 = TOT 단계;
(17)     [TOT는] = y로;
18  }
 19  무효 DFS ( INT의 X) {
 20      SIZ [X] = 1 ; 알루미늄 [X] = 0 , 팽 [X] = 0 ;
(21)      에 대한이 ( int로 I = Fi를 [X] I, I = NE [I]) {
 22          INT의 Y = [I];
23          DFS (Y);
24          등 [X] = (알 [X] 알 + [Y] + (SIZ [Y] * w [Y])) % 개조;
25          팽 [X] = (송곳니 [X] + 팽 [Y] + 등 [Y] * w [Y] * 2 + w [Y] * w [Y] %의 개조 * SIZ [Y]) % 개조;
26          SIZ [X] + = SIZ [Y];
27      }
 28 }
 29  무효 DFS2 ( INT의 X)를 {
 30      의 ANS = (ANS + 팽 [X]) % 개조;
(31)      에 대한이 ( int로 I = Fi를 [X] I, I = NE [I]) {
 32          INT의 Y = 내지 [I];
33          LL의 FX = (송곳니 [X] 팽 [및] -at [및] * w [Y] * 2 -w [Y] * [y]는 개조 *의 %의 SIZ [및] w) %의 개조,
 34              X = 합니다 ([X] -at [및] - (SIZ [Y] * w [및])) % 개조;
35          팽 [Y] = (송곳니 [및] + FX AX + w * [Y] * 2 + w [Y] * w [Y] * %의 개조 (N- SIZ [및])) % 개조;
36          [Y] =에 (*)에서 [및] + AX + (N-SIZ [및] w [Y]) % 개조;
37          DFS2 (Y);
(38)     }
 39  }
 40  INT 의 main () {
 41 개      의 Sb = read ()를 N =, = Q) (판독 ) (판독;
42      NI = 50,000,004 ;
(43)      에 대한이 ( int로 I = 2 [I] (판독 F = [I] = W) 내가 ++; i가 N = <) (판독, 추가) (F [i]는, I);
44      DFS ( 1 );
45      DFS2 ( 1 );
46      의 printf ( " % LLD \ 없음 " (ANS + 모드) % 개조 * NI % 개조);
(47)      동안 (q-- ) {
 48          INT U = ) (판독;
49         LL 광고 = ) (읽기;
50          [유] = (w [U] + AD) w %의 모드;
51          DFS ( 1 );
52          ANS = 0 ;
53          DFS2 ( 1 );
54          의 printf ( " % LLD \ 없음 " (ANS + 모드) % 개조 * NI % 개조);
55      }
 56      반환  0 ;
57 }
코드보기

긍정적 인 해결책은을 끈적 거리는되지 않습니다

추천

출처www.cnblogs.com/hzoi-cbx/p/11374107.html