HDU 4325花フェンウィックツリー離散+

フラワーズ

問題の説明

すべてに知られているように、ブルーミング時間及び持続時間は、花の異なる種類の間で変化します。今、花でいっぱい植えられた庭園があります。庭師は、特定の時間に庭に咲くますどのように多くの花を知りたがっています。しかし、そこにあまりにも多くの花が庭にあるので、彼は彼を助けるためにあなたを望んでいます。

入力

最初の行は、単一の整数t(1 <= T <= 10)、テストケースの数を含んでいます。
各場合について、最初の行は、N(= 10 ^ 5 1 <= Nの<)花の数であり、M(1 <= M <= ^ 5 10)は、クエリ倍であるNとMの整数2を含有します。
次のn行において、各行は2つの整数のS含ま I 及びT I (1 <= S I <= T I ^ 9 <= 10)、i番目の手段は、花が同時に開花する[S 、I 、T I ] 。
次のMラインにおいて、各ラインは整数Tが含まれている iが 、i番目のクエリの時間を意味します。

出力

各場合について、出力ケース番号を示し、次にM個のラインを印刷するように。各行は咲く花の数を意味し、整数が含まれています。
サンプル出力は、より多くの詳細については、ご利用いただけます。

サンプル入力

2
1 1
5 10
4
2 3
1 4
4 8
1
4
6

サンプル出力

ケース#1:
0
ケース#2:
1
2
1

分析

  私は限り、あなたは愚かではないとして、これはフェンウィックの木ボードは、シングルポイント範囲クエリを修正問題であることを確認することができるはずだと思いませんが、データはビットビッグだ、オープン配列は確かに劣らず開いているが、それは1E5花までで、1E9ので、間で無駄にされている数字の多くは離散の使用は、同じ数字にマークの同じ番号を覚えていて、離散時間離散が求めている、があります。

  しかし、私はこの質問をしようとした非常に好奇心ガチョウ、無離散1E5直接オープン配列だと、その後フェンウィックツリーを実行して、私は非常にそれがAであることに驚きました!データHDUの良い水の男後の質問のうちは確かにあなたがそうコードそれを見て、離散使ってみましょう......

  

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <アルゴリズム>
 4。 使用した 名前空間STD;
 5  CONST  INT N = 1E5 + 5 ;
 6  INT TR [N + 5。、A [N +] 5。];
 7  構造体ノード{
 8      int型のID、X;
 9      BOOLの 演算子 <(CONSTノード&)のconst {
 10          リターン Xの<アックス; //は互いに同じ処理を促進する
11。     }
 12である } P [N + 5。];
 13  // フェンウィックツリー開始
14  INT lowbit(INT X){
 15      リターン X&( - X);
 16  }
 17  空隙追加(int型 X、INT W){
 18は     、一方(X <= N){
 19。          TR [ X] + = W;
 20は、          X + = lowbit(X)
 21である     }
 22れる }
 23である intを合計(INT X){
 24      INT ANS = 0 ;
 25      ながら(X){
 26、IS         = + ANS TR [X];
 27          X- = lowbit(X);
 28      }
 29      リターンANS;
 30  }
 31である // アレイのツリー端
32  INT メイン(){
 33である     整数 N - 、CAS = 0 ;
 34は、      scanfの(" % D "およびN-);
 35      ながら(N-- ){
 36          のprintf(" ケース#1%のD:\ N- "++ CAS);
 37          int型; totn、TOTM
 38は          scanfの(" %D%D"&Totn、&TOTM);
 39          totn * = 2 ;
 40          TOTM + = totn;
 41である         ためINT I = 1 ; I <= TOTM; I ++ ){
 42は              scanfの(" %のD "、&P [I] .X );
 43れる              P [i]は.ID = I;
 44である             // リード一旦全てのデータ、及び順序が規則構造の後に破壊されているので、iの値を記録
45          }
 46は、          (P +ソート。1、P + + TOTM 。1 );
 47          A [P [ 1 ] .ID] = 1 ;
 48         整数 K = 1。;
 49          INT I = 2 ; I <= TOTM I ++ ){
 50              IF(P [I] == P .X [I- 1 ] .X)A [P [I] .ID] K =; //は離散値に等しいが、ほぼ確実と同じようになり
51れる              A [P [I] .ID] ++ = K;
 52である         }
 53で          のmemset(TR、0はsizeof (TR));
 54である         ためINT I = 1 ; I <= totn; I + = 2 ){
 55              追加(A [I]、1。 56が              追加(A [I +が1] + 1、 - 1 )。
57          }
 58          のためにINT I = totn + 1 ; I <= TOTM; I ++ ){
 59              のprintf(" %D \ n " 、合計([I]))。
60          }
 61      }
 62      リターン 0 63 }

 

 

 

おすすめ

転載: www.cnblogs.com/anyixing-fly/p/12431038.html