[Bzoj2743]花

各次の位置の同じ色の点を前処理と呼ば次に、その後左後端部を尋ねる左右ポインタソートシフトされ、削除するように構成されたの位置を、[i]は次の[F [次のよう ] + 1 。だけでなく、オリジナルのマーカーを削除してもF [次に[I]場合- 1 、即ち、最後の問い合わせ$ \のsum_ 1 = {I}} ^ {R&LT F [I] $ 、ツリーラインを維持することができます。

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#define N 2000005
 4  の#define L(K << 1)
 5  の#define R(L + 1)
 6  の#define中間(L + R >> 1)
 7  の構造体JI {
 8      整数X、Y、ID。
9      ブール 演算子 <(CONSTの JI&A)のconst {
 10          リターン X < 斧。
11      }
 12  } Q [N]。
13  のint [<< N F N、M、L、ANS [N]、[N]は、FI [N]、NEX [N]、2 ]。
14  ボイド更新(int型 K、int型の L、int型の R、int型のx、int型のY){
 15      であれば(L == R){
 16          F [K] + = Y。
17          リターン;
18      }
 19      であれば(X <= MID)更新(L、L、中、X、Y)
20      他の更新(R、中間+ 1 、R、X、Y)。
21      F [K] = F [L] + F [R]。
22  }
 23  INTクエリ(INT K、int型の L、INT R、INTX、int型のY){
 24      であれば((L> Y)||(X> R))戻り 0 ;
25      であれば((X <= 1)&&(R <= Y))リターン[K] F。
26      リターンクエリ(L、L、中、X、Y)+クエリ(R、中間+ 1 、R、X、Y)。
27  }
 28  INT メイン(){
 29      のscanf(" %dの%の* d個%のD "、&​​N、&M)。
30      のためにint型 i = 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。
31      のためにint型 I; i-- iがN =){
 32          NEX [I] = Fiの[I]]。
33          Fiの[I] = I。
34      }
 35      のためのint型 i = 1 ; iはN- < 4 ; iは++ 36          であれば(NEX [Fiの[I])更新(11、nは、NEX [Fiの[I]、1 )。
37      のためにint型 I = 1 ; I <= M; iが++ ){
 38          のscanf(" %D%dの"、&​​Q [i]は.X、&Q [i]の.Y)。
39          Q [i]は.ID = I。
40      }
41      ソート(Q + 1、Q + M + 1 )。
42      L = 1 43      のためには、int型 I = 1 ; I <= M; iは++ ){
 44          ながら(L < Q [I] .X){
 45              であれば(NEX [L])更新(11、nは、NEX [L]、 - 1 )。
46              であれば(NEX [NEX [L])更新(11、nは、NEX [NEX [L]、1 )。
47              L ++ 48          }
 49の          ANS [Q [i]は.ID] =クエリ(11 、N、Q [i]は.X、Q [i]の.Y)。
50      }
 51      のためのint型 I = 1 ; I <= M; iが++)のprintf(" %d個の\ n " 、ANS [I])を、
52 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11249710.html