アップルツリーはフェンウィックツリーのタイムスタンプを持っています

問題の説明

リンゴの木はカカーの家の外にあります。毎年秋には、りんごの多くは木に成長します。カカは非常に多くのリンゴを好きなので、彼は慎重に大きなリンゴの木を育ててきました。

ツリーはありNの枝で接続されているフォークを。カカ番号に1によるフォークNと根が常に1りんごによって番号が付けられてはフォークの上に成長すると2個のりんごは同じフォーク上に成長しません。カカはリンゴの木の生産能力の彼の研究のために、サブツリーにありますどのように多くのリンゴ知りたいです。

トラブルは、新しいリンゴが空のフォークにいくつかの時間を育てることとカカーは彼のデザートに木からリンゴを選ぶかもしれないということです。あなたはカカーを助けることができますか?

 

 

入力

最初の行は、整数含まNNツリー内のフォークの数であり、100,000以下)、。
次のN - 1行それぞれは、2つの整数含むU及びVフォーク意味し、U及びフォークVが分岐によって接続されています。
次の行は、整数含まMM ≤100,000)。
次のM個の行それぞれのいずれかであるメッセージ含有
CのXフォークアップルの存在を意味し、」Xを変更されました。フォーク上のリンゴがある場合、すなわち、その後、カカはそれを選びます。そうでない場合は、新たなリンゴが空のフォークに成長してきました。
又は
QのXフォーク上記サブツリー内のリンゴの数の問い合わせを意味し、」XをフォークX上のりんごを含むが、(存在する場合)
ツリーは冒頭にりんごのいっぱいであることに注意してください

 

 

出力
すべてのお問い合わせについては、出力行あたりの対応の答え。
 

 

サンプル入力
3 1 2 1 3 3 Q 1つのC 2 Q 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  使用 名前空間STDを、
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は、<G [S] .size(); ++ IT44      {
 45         DFS(G [S] [それ])。
46      }
 47      エンド[S] = ++ nCount。
48  }
 49  
50  のint main()の
 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 "、&​​、&B);
59          G [A] .push_back(B)。
60       }
 61       nCount = 0 62の       DFS(1 )。
63       のために(i = 1 ; I <= nCount; I ++ 64        lowbit [I] = I・(I ^(I- 1 ))。
65       のために(i = 1 ; I <= nCount I ++)// 求C []数组
66        C [I] = I-(I-lowbit [I] + 1)+ 1 67       のために(i = 1 ; iが<= N; iが++ 68       {
 69         HasApple [I] =1 ;
70       }
 71        のscanf(" %dの"、&M)。
72      のために(i = 0 ; iがm <; iは++ 73      {
 74の         チャー CMD [ 10 ]。
75          のint ;
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個の\ n "、(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