사과 나무는 펜윅 나무의 타임 스탬프를 가지고

문제 설명

카카의 집의 사과 나무 외부가있다. 모든 가을, 사과의 많은 나무에 성장할 것입니다. 카카는 매우 사과를 좋아하는, 그래서 그는 조심스럽게 큰 사과 나무를 육성하고있다.

나무는이 N의 나뭇 가지로 연결되어 포크. 1로 포크 카카 번호 N 루트는 항상 1. 사과로 번호가 매겨진는 포크에 성장하고 두 개의 사과 같은 포크에 성장하지 않습니다. 카카는 사과 나무의 생산 능력을 자신의 연구를 위해, 하위 트리에 얼마나 많은 사과 알고 싶어.

문제는 새로운 사과가 빈 포크에 시간이 성장할 수 있으며, 카카는 자신의 디저트 나무에서 사과를 선택할 수 있다는 것이다. 당신은 카카 도와 드릴까요?

 

 

입력

첫 번째 라인은 포함 정수 N ( N 트리 포크의 개수 ≤ 100,000)를.
다음 N - 1 개 라인마다 두 포함 정수 U를 하고 V를 포크 즉, U 및 포크 (V)가 분기하여 연결되어있다.
다음 줄은 정수가 들어 M ( M ≤ 100,000).
다음 M의 라인은 각각 하나 인 메시지에 포함
" C의 X 포크에 사과의 존재를 의미한다" X를변경되었습니다. 포크에 사과가있는 경우 즉, 다음 카카를 선택; 그렇지 않으면 새로운 사과는 빈 포크에 성장했다.
또는
" Q의 X 포크 상기 서브 트리 사과의 개수에 대한 문의 수단" X 포크 X를 (존재하는 경우)을 포함 사과,
트리 주 처음에 사과 가득

 

 

산출
모든 문의를 들어, 출력 라인 당 대응 대답.
 

 

샘플 입력
1 2 3 3 3 1 1 Q Q C 2 1
 

 

샘플 출력
3 2
************************************************** ************************************************** ******************************
가장 중요한 것은 기록 펜윅 나무의 타임 스탬프입니다
************************************************** ************************************************** ******************************
  1  / * 
  2  有时间戳的树状数组,
   3  * / 
  4 #INCLUDE <iostream>
   5 #INCLUDE < 문자열 >
   6 #INCLUDE <CString을>
   7 #INCLUDE <cmath>
   8 #INCLUDE <큐>
   9 #INCLUDE <cstdio >
 10 #INCLUDE <지도>
 11 #INCLUDE <알고리즘>
 12  이용한  스페이스 성병;
13  #DEFINE   maxn 220000
 14 의 typedef 벡터 < INT > VCT_INT;
15 벡터 <VCT_INT> G (maxn / 2 );
 nCount, N-, m]
 . 17  INT 시작 [MAXN 같이, 끝 [MAXN]
 18는  INT ] C [MAXN], [MAXN] lowbit
 . 19  INT의 HasApple [MAXN / 2 ]
 20   INT query_sum ( INT P) // 찾아내는 상기 내부 섹션 
(21)은  {
 22는      INT의 SUM = 0 ]
 (23)이      그동안 (P> 0 )
 24      {
 25         SUM + = ] C [P]
 26 인         P- = lowbit [P]
 27      }
 28      리턴 SUM;
 29  }
(30)  
(31)는   공극 수정 ( INT의 P, int로 발을) // 삽입 업데이트 
32  {
 33은       그동안 (P는 <= nCount)
 (34)는       {
 35          C [P] + = 브로;
 36          P + = lowbit [P]
 37       }
 38이다  }
 39  
40  보이드 DFS ( INT의 S) // 삽입 스탬프 
(41)는  {
 (42)가     시작 [S] = ++ nCount;
 43이다     위해 ( int로 IT가 = 0 ; IT <G [S] 크기는 (); ++ IT를)
 44      {
 45         DFS (G [S] [그]);
46      }
 47      최종 [S] = ++ nCount;
48  }
 49  
50  INT 주 ()
 51  {
 52     INT의 I, J, K;
53     동안 (는 scanf ( " %의 D ' , N)! = EOF)
 54     {
 55        INT의 A, B, C;
56        (I = 1 ; i가 N이 <I ++ )
 57       {
 58          는 scanf ( " % d 개 %의 D ' , A, 및비);
59          G [A] .push_back (b);
60       }
 61       nCount = 0 ;
62       DFS ( 1 );
63        (I = 1 ; I <= nCount; I ++ )
 64        lowbit [I] = 1 및 (I ^ (I- 1 ));
65        (I = 1 ; I <= nCount I ++) // 求C []数组
66        C [I] = I- (I-lowbit [I] + 1 ) + 1 ;
(67)       에 대한이 (I = 1 난 ++; 나는 <= N )
 68       {
 69         [I] = HasApple을1 ;
70       }
 71        는 scanf ( " %의 D ' , m);
72       (I = 0 ; I <m은, 내가 ++ )
 73      {
 74 명           을 cmd [ 10 ];
75          INT a 및
76          는 scanf ( " % S %의 D " (CMD), & A );
(77)          만약 CMD ([ 0 ] == ' C ' )
 78          {
 79              의 경우 (HasApple [A])
 80              {
81                  수정 (시작 [A] - 1 );
82                  수정 (끝 [A] - 1 );
83                  HasApple [A] = 0 ;
84              }
 85              
86              {
 87                  수정 (시작 [A], 1 );
88                  수정 (최종 [A], 1 );
89                  HasApple [A] = 1 ;
90              }
 91          }
 92          
93          {
 94              INTT1 = query_sum (최종 [A]);
95              INT의 T2 = query_sum (시작 [A]);
96              의 printf ( " % D \ 없음 " , (T1-T2) / 2 + HasApple [A]);
97          }
 98      }
 99     }
 100 }
코드보기

 

HTTPS : //www.cnblogs.com/sdau--codeants/p/3484874.html 재현

추천

출처blog.csdn.net/weixin_34233856/article/details/93432863