C ++ - POJ2777-カウントカラー〔セグメントツリー] [タグ怠惰] [セクション変形例]

 

 

1の#include <cstdioを>
 2の#include <アルゴリズム>
 3  使用して 名前空間をSTD。
4  CONST  INT MAXN = 1E5 + 10 5  構造体ノード{ INT L、R、怠惰、色;} T [MAXN * 4 ]。
6  INT L、R、C、N、M、Q。
7つ の#define LS T [X] .L
 8  の#define RS T [X] .R
 9  INTカウント(INT X){ int型 ANS = 0(; X; X >> = 1であれば(X&1)++ ANS; リターンANS;}
 10  空隙プッシュダウン(int型 X){ もし(T [X] .lazy)T [LS] .lazy = T [RS] .lazy = T [LS] .color = T [RS] .color = T [X] .lazy、T [X] .lazy = 0 ;}
 11  空隙更新(INT X){T [X] .color = T [LS] .color | T [RS] .color;}
 12  空隙ビルド(int型のx、int型の L、int型R){
 13      であれば(L == R){T [X] .color = 1リターン;}
 14      int型ミッド=(L + R)>> 1 ; T [X] .L =(X << 1)、T [X] .R =(X << 1 |1 );
15      ビルド(LS、L、MID)、ビルド(RS、ミッド+ 1 、R)、更新(X)。
16  }
 17  空隙更新(int型のx、int型の L、int型R){
 18      であれば(L <= L && R <= R){T [X] .color = T [X] .lazy = 1 <<(C- 1) ; リターン;}
 19      プッシュダウン(X)。INTの半ば=(L + R)>> 1 20      であれば(L <= MID)更新(LS、L、MID)。
21      であれば(R> MID)更新(RS、ミッド+ 1 、R)。
22      更新(X)
23  }
24  int型の照会(int型のx、int型の L、int型R){
 25      であれば(L <= L && R <= R)戻りT [X] .color。
26      プッシュダウン(X)。INT半ば=(L + R)>> 1、ANS = 0 27      であれば(L <= MID)ANS | = クエリ(LS、L、MID)。
28の     場合(R>中間)はANS | =クエリ(RS、ミッド+ 1 、R)。
29の     リターンANS;
30  }
 31  INT メイン(){
 32      のscanf(" %D%D%D "、&​​N、&M&Q)、ビルド(11 、N)
33      のためのint型 ; q-- A、B {;)
 34          CHAR S [ 2 ]; scanf関数(" %S " 、S)。
35          であれば(S [ 0 ] == ' C ')のscanf(" %D%D%D "、&​​、&B、&C)、L =分(a、b)は、R = MAX(a、b)は、更新(11 、N)
36          のscanf(" %D%D "、&​​、&B)、L =分(a、b)は、R =(a、b)はMAX、のprintf(" %D \ n "、カウント(クエリ(11、N)))。
37      }
 38      リターン 0 39 }

 

おすすめ

転載: www.cnblogs.com/JasonCow/p/12347045.html