HDU 6703のアレイ重みセグメントツリー

私は理解していない長い時間のためにタイトルを読んで......

あなたは、nの長さを内に配置されている与えます。二つの動作、それぞれの数の増加内部時刻10 000 000、または最小数kは以上等しくないA1-ARを、尋ねます。kがNを超えていません。だから、その答えは、n + 1以下であってはなりません。

私たちは、元のツリーラインのシーケンスは元のシーケンス、元の配列の添字値の値のために、インデックスを重み付けを行うことを検討してください。

のみならず、その後、修飾セグメントツリー上付きのkよりも小さいない考える[K + 1、N + 1]回答の範囲。A1-ARセグメントツリー(プロ配列の添字)Rよりも大きい値に等しくありません。数を最小にするために、我々はサブツリー検索を左、左部分木の上に見つけることができるということです。

数aiを追加、修正を検討し10 000 000、それは元の順列であるため、A1-ARこの条件に制限されなくなり、この数を愛することを意味していない、今、一人でこれを愛それは、大きな数に変更されました。だからセグメントツリーは値を変更するマークされ、N + 1に、このように対応する愛、それはもはやA1-ARこの条件の制限による影響を受けません。

複雑さは、直感的な感覚はすぐに停止範囲外であることが判明範囲の一部ではなく、mlognです。のみ再帰端での範囲内のセクション、両者の合計は、それがLOGNあります。

1の#include <cstdioを>
 2の#include <アルゴリズム>
 3の#include <CStringの>
 4の#include <cmath>
 5  使って 名前空間STD。
6  のconst  int型 MAXN = 101000 7  INTのN、M、T、VEC [MAXN]、[MAXN]。
8  構造体segtree
 9  {
 10      のint MAXN [ 4 * MAXN]。 
11      ボイドビルド(int型 K、int型の L、int型の R、INT * VEC)
 12      {
13          場合(L == R)
 14          {
 15              MAXN [k]が= VEC [L]を、
16              リターン;
17          }
 18          INTミッド= L + R >> 1 19          ビルド(K << 1 、L、中間、VEC)。
20          ビルド(K << 1 | 1、中間+ 1 、R、VEC)。
21          MAXN [K] = MAX(MAXN [K << 1 ]、MAXN [K << 1 | 1 ])。
22      }
 23      の空隙の変化(int型K、int型の L、int型の R、INT X)
 24      {
 25          であれば(L == R)
 26          {
 27              MAXN [K] = N + 1 28              リターン;
29          }
 30          INTミッド= L + R >> 1 31          であれば(X <= MID)
 32              変化(K << 1 、L、中、X)。
33          他の
34              変化(K << 1 | 1、中間+ 1 、R、X)。
35          MAXN [K] = MAX(MAXN [K << 1 ]、MAXN [K << 1 | 1 ])。
36      }
 37      INTクエリ(INT K、int型の L、int型の R、int型のx、int型のY)
 38      {
 39          場合(R < Y)
 40              リターン - 1 41          であれば(L == R)
 42              リターンL。
43          INT半ば= L + R >> 1、RES = - 1 44          もし(MAXN [K << 1 ]> X)
 45の              RES =クエリ(K << 1 、L、中、X、Y)
46          であれば(RES == - 1 47              であれば(MAXN [K << 1 | 1 ]> X)
 48の                  RES =クエリ(K << 1 | 1、中間+ 1 、R、X、Y)。
49          リターンのres;
50      }
 51  } ST。
52  のint main()の
 53  {
 54      のため(のscanf(" %dの"、&​​T);!T = 0 ; T-- 55      {
 56          
57          int型 LST = 0 58          のscanf(" %D%dの"、&​​N、&M)。
59          のためには、int型 i = 1 ; iが<= N; iが++ 60          {
 61              のscanf(" %dの"、および[I])。
62              VEC [I] = I。
63          }
 64          VEC [N + 1 ] = N + 1 65         st.build(11、N + 1 、VEC)。
66          int型のTX、TY、選びます。
67          のためにint型 I = 1 ; I <= M Iは++ 68          {
 69              のscanf(" %dの"、およびOPT)。
70              であれば(OPT == 1 71              {
 72                  のscanf(" %dの"、&TX);
73                  TX ^ = LST。
74                  st.change(11、N + 1 、[TX])。
75              } そうでなければ
76              {
 77                  のscanf(" %D%dの"、&​​TX、&TY)。
78                  TX ^ = LST。
79                  TY ^ = LST;
80                  LST = st.query(11、N + 1 、TX、TY)。
81                  のprintf(" %d個の\ n " 、LST)。 
82              }
 83          }
 84      }
85 }

 

おすすめ

転載: www.cnblogs.com/iat14/p/11404869.html