1つの余分重量のセグメントツリーを削除します

 最近狂った運動セグメントの木。

  この質問は、<iは位置1として[J] <[I]を&&各位置満たす<= jについて、この数の後に除去されている番号を見つけるために、1-nは、非常に簡単な質問意図されていますそしてより多くの。

     私たちは、この位置は、実際に貢献していない、私は、条件の現在位置が満たされた場合には、前の任意の番号を削除する各位置のための貢献を考慮し、現在の位置は、位置が、これはマイナスを満たす削除することと等価です場所条件。

     番号を削除することにより、現在位置が、それが可能になれば、私は元の位置に把握しなければならず、これだけの数よりも大きいつの位置は、我々は簡単に特定の値よりもiビット前問い合わせの多数することができ、そして(それが照会する権利を持っている)の位置で最大値を問い合わせます。それから私の場所、答えになるために、あなたが以前の最大を削除する必要があり、我々は条件を満たすために位置を追加することに相当し、以前の最大値を、削除します。

   前の数字よりも2以上大きいがある場合、この数は確かに答えにすることはできません。

   したがって、我々は、アレイ、アレイVIを維持する[I]はIを削除するために、条件数、最大値、最小値を満足する新たな位置を生成することができます。答えはあります!

  重みのセグメントツリーとメンテナンスが友達になれます!

  

  1の#include <iostreamの>
   2の#include <stdio.hの>
   3の#include < 文字列・H>
   4の#include <アルゴリズム>
   5  の#define LL長い長
   6  の#define LSONのRT << 1
   7  の#define rsonのRT << 1 | 1
   8の#include <ベクトル>
   9  使用して 名前空間はstdを、
10  のconst  int型 MAXX = 2E5 + 6 11  INT VIS [MAXX]。
12  構造体ノード{
 13    のint L、R。
14    int型のCNT;
15 }ツリー[MAXX << 2 ]。
16  INT [MAXX]。
17  ボイド buildtree(INT RT、INT L、INT R){
 18     ツリー[RT] .L = L。
19     ツリー[RT] .R = R。
20     ツリー[RT] .CNT = 0 21     であれば(L == R){
 22       リターン23     }
 24     INT半ば=(L + R)>> 1 25     buildtree(LSON、L、MID)。
26     buildtree(rson、ミッド+ 1 、R)。
27  }
 28  空隙更新(INT RT、INT POS){
 29      のint L = ツリー[RT] .L。
30      のint R = ツリー[RT] .R。
31      であれば(L == R){
 32          ツリー[RT] .CNT ++ 33          リターン;
34      }
 35      INT半ば=(L + R)>> 1 36      であれば(POS <= MID)
 37          更新(LSON、POS)。
38      他の
39          の更新(rson、POS)。
40     ツリー[RT] .CNT =ツリー[LSON] .CNT +のツリー[rson] .CNT。
41  }
 42  INT query_num(INT RT、INT W){
 43      のint L = ツリー[RT] .L。
44      のint R = ツリー[RT] .R。
45      であれば(L == R){
 46          リターンツリー[RT] .CNT。
47      }
 48      INT半ば=(L + R)>> 1 49      であれば(<= W {MID)
 50          戻りツリー[rson] .CNT + query_num(LSON、W)。
51      } {
52          リターンquery_num(rson、W)。
53      }
 54  }
 55  INT getmax(INT RT){
 56      のint L = ツリー[RT] .L。
57      のint R = ツリー[RT] .R。
58      であれば(L == R){
 59          リターンL。
60      }
 61      INT半ば=(L + R)>> 1 62      であれば(ツリー[rson] .CNT){
 63          リターンgetmax(rson)。
64      } {
 65          リターンgetmax(LSON)。
66      }
 67  }
 68  INT メイン(){
 69     INT N。
70     一方(〜のscanf(" %d個"、&N)){
 71        のためのint型 i = 1 ; iが<= N iが++ ){
 72          のscanf(" %dの"、および[I])。
73        }
 74        のmemset(VIS、0はsizeof (VIS))。
75        INT MX = 0 76        buildtree(11 、N)
77        のためにint型 i = 1 ; iが<= N; iが++ ){
 78           INT S = query_num(1 、[I])。
79           であれば(S == 1 ){
 80              int型の POS = getmax(1 )。
81              VIS [POS] ++ ;
82           } そう であれば(S == 0 ){
 83              VIS [[I]] - 84           }
 85           更新(1 、[I])。
86        }
87の       int型のANS;
88        MX = - 2 89        のためには、int型 i = 1 ; iが<= N; iが++ ){
 90            であれば(MX < VIS [I]]){
 91の              ANS = [I]。
92              MX = VIS [I]]。
93            }
 94            そう であれば(MX == VIS [I]] && ANS> [I]){
 95の              ANS = [I]。
96              MX = VIS [I]]。
97            }
 98        }
 99         のprintf(" %Dの\ nを" 、年);
100     }
 101     戻り 0 ;
102 }

 

   

おすすめ

転載: www.cnblogs.com/bluefly-hrbust/p/11432783.html