最近狂った運動セグメントの木。。。
この質問は、<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(1、1 、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 }