2019南昌ICPCネットワークゲームIタイトルブロックセットのBIT

https://nanti.jisuanke.com/t/41356

修復する2次元の点の数は、でき社長はまた、ビットツリー、3次元部分順序を設定CDQ

しかし、最終的に、私はセットBITの暴力を阻止することにしました...

複雑性は、$ M(ブロックサイズ*のLOGN + blocknum)$です

明らかに、$の\のSQRT {N} $ブロックによれば、最適ではありません

我々は、適切なブロックサイズを大きくしたブロックの数を減らし、$のブロックサイズ* LOGN = blocknum $ようにすることができます

この質問には、おそらく$ \ sqrtの{1E6} $ $ \へのsqrt {2E6} $、それとの間に

#include <ビット/ STDC ++ H> 
のための#define担当者(II、a、b)は(INT II =; ++ II、II <= b)は
名前空間stdを使用。
CONST int型MAXN = 2E5 + 10、MAXM = 6E2 + 10。
N INT、M。
名前空間fastio { 
インラインブールisdigit(チャーC){戻りC> = 48個の&& C <= 57;} 
のconst int型maxsz = 1E7。
クラスfast_iostream {パブリック:
  チャーCH = get_char()。
  インラインチャーget_char(){ 
    静的チャーバッファー[maxsz]、* A =バッファー、* B =バッファー。
    戻りB == &&(B =(=バッファ)+の関数fread(バッファ、1、maxsz、STDIN)、B == A)EOF:* ++;?
  } 
  ボイドオペレータ>>(INT&TMP){ 
    TMP = 0。
    一方、(!isdigit(CH)&& CH = EOF){CH = get_char();}; 
    (CH == EOF)を返すと、
    {TMP = CH-48 +(TMP << 1)+(TMP << 3)を行います。
  }
int型のAA [MAXN]、[MAXN] BB。 
}。
INTトップ;チャーSTKの[8]。
無効プット(INT&TMP){ 
  場合(!TMP){のputchar( '0');リターン;} 
  トップ= 0; 
  (TMP)STKの[++トップ】一方TMPの10%+を= '0'、TMP / = 10。
  一方(上部)のputchar(STK [top--])。
} 
} fastio :: fast_iostream IO。
クラスビット{パブリック:
  INTノード[MAXN]。
  インラインINTポンド(INT X){戻りX&( - X);} 
  インラインボイド更新(int型のPOS、INTヴァル){ 
    ため(; POS <= N; POS + = LB(POS))ノード[POS] + =ヴァル。
  } 
  インラインINTは、(int型POS){尋ねる
    INT合計= 0; 
    用(; POS> 0; POS-= LB(POS))の和+ =ノード[POS]。
    合計を返します。
  } 
  インラインINTクエリ(INT L、int型R){ 
    リターン尋ねる(R)-ask(L-1)。
  } 
}。
クラスsqblock {パブリック:
  構造体ブロック{
    int型のL、R、ビットツリー; 
    ボイド更新(ヴァルをINT、POSをINT){tree.update(POS、ヴァル);} 
    int型の照会(int型のL、R INT){戻りtree.query(L、R);} 
  }ノード[MAXM]。
  INT番号[MAXN]、SZ、CNT。
  ボイドのinit(int型N){ 
    SZ = SQRT(2E6)。
    担当者(I、1、n)のID [I] =(I-1)/ SZ + 1; CNT = ID [N]; 
    担当者(I、1、CNT)ノード[I] .L =(I-1)* SZ + 1。
    担当者(I、1、CNT-1)ノード[I]。R =私はSZを*。
    ノード[CNT] .R = N。
    担当者(I、1、N)の場合(!AA [I] = AA [I-1])ノード[ID [I]]更新(AA [i]は、1)。
  } 
  ボイド更新(int型のx、int型のY){ 
    IF(X> 1つの&& AA [X] = AA [X-1]!)ノード[ID [X]]更新(AA [X]、 - 1)。
    (!X <N && AA [X + 1] = AA [X])であれば、ノード[IDが[X + 1]の更新(AAの[X + 1] - 1)。
    AA [X] Yを=。
    IF(X> 1 && AA [X] = AA [X-1]!)ノード[ID [X]]更新(AA [x]は、1)。
    IF(X <N && AAの[X + 1] = AA [X]!)ノード[ID [X + 1]の更新(AAの[X + 1]、1)。
  } 
  int型の照会(int型L、int型のR、int型のx、int型のY){ 
    int型POSL = ID [L]、POSR = ID [R]、ANS = 0。
    IF(POSL == POSR){ 
      担当者(I、L、R)ANS + =(!AA [I] = AA [I-1] && AA [I]> = X && AA [I] <= Y)。
      ANSを返します。
    } 
    担当者(I、POSL + 1、POSR-1)ANS + =ノード[i]は.query(X、Y)
    担当者(I、L、ノード[POSL] .R)ANS + =(!AA [I] = AA [I-1] && AA [I]> = X && AA [I] <= Y)。
    担当者(I、ノード[POSR] .L、R)ANS + =(!AA [I] = AA [I-1] && AA [I]> = X && AA [I] <= Y)。
    ANSを返します。
  } 
}平方。
INTのX、Y、B、C、D、E、ANS。
  担当者(I、1、n)がCIN >> AA [I]。
  square.init(N)
    (== 1){もし
      CIN >> X; CIN >> Y。
      (!AA [X] = Y)square.update(X、Y)であれば、
    }他{ 
      CIN >> B; CIN >> C; CIN >> D; CIN >> E。
      ANS = square.query(B、C、D、E)。
      IF(AA [B] == AA [B-1] && AA [B]> = D && AA [B] <= E)ANS ++。
      fastio ::入れ(ANS);のputchar( '\ n')で。
    } 
  } 
}

 

おすすめ

転載: www.cnblogs.com/nervendnig/p/11498520.html