宮殿のA.The美しい値

 

書式#include <iostreamの> 
書式#include <stdio.hに> 
する#include < 文字列の.h> 
の#include <アルゴリズム> 
書式#include <ベクトル>
 の#define LL長い長い
 使って 名前空間はstdを、
const  int型 MAXX = 1E5 + 10 構造体ノード{
    int型のL、R。
   LLのワット。
}ツリー[MAXX * 40 ]。
int型のルート[MAXX]。
構造体ノード{
    int型のX、Y。
   LLのワット。
   ブール 演算子 <(constのノード&S)CONST{
      戻り X < SX。
   } 
} [MAXX]を指します。
ベクトル < int型 > VX; 
ベクトル < int型 > VY。
LLのn; 
int型のCNT; 
LL get_val(LLのX、LLのY){ 
    LLのK =分(X、分(N-X + 1、分(Y、N-Y + 1 )))。
    LLミネソタ州 = K。
    K - ; 
    LL における = N- 2 * K。
    LL アウト = N * N-  * もし(x == N-ミネソタ+ 1){
         戻り OUT + NK-Y + 1 ; 
    } そう IF Y ==(ミネソタ州{
         戻り OUT +の + NK- X; 
    } そう IF(X == ミネソタ州){
         戻り OUT +  * 2 - 2 + Y- K; 
    } {
         戻り OUT +の * 3 - 3。 + X- K; 
    } 
} 
/// / Y半順序社長ツリーメンテナンス間隔と
ボイドインサート(int型 L、int型の R、int型プリ、INT&今、int型のPOS、LLのW){  = ++ CNT。
   ツリー[今] = ツリー[事前]。
   ツリー[今] .W + = W。
   もし(L == R){
      リターン
   } 
   INT半ば=(L + R)>> 1 もし(POS <= MID)インサート(L、中間、ツリー[事前] .L、ツリー[今] .L、POS、W)。
   他のインサート(MID + 1 、R、ツリー[事前] .R、ツリー[今] .R、POS、W)。
} 
LLクエリ(int型 L、INT R、int型の L、INT R、INT QL、INT QR){
     // 区间查询
    場合(QL <= L && R <= QR){
        戻りツリー[R] .w- ツリー[L] .W。
    } 
    INT半ば=(L + R)>> 1 
    LL ANS = 0 もし(QR <= MID){
         戻りクエリ(ツリー[L] .L、ツリー[R] .L、L、中間、QL、QR)。
    } そう であれば(QL> MID){
          戻りクエリ(ツリー[L] .R、ツリー[R] .R、中間+ 1 、R、QL、QR)。
    } {
         戻りクエリ(ツリー[L] .L、ツリー[R] .L、L、中間、QL、QR)+クエリ(ツリー[L] .R、ツリー[R] .R、中間+ 1 、R、QL、QR ); 
    } 
} 
LL CAL(LL X){ 
    LL和 = 0 一方、(X)
        の和 + = X%10、X / = 10 戻り値の合計。
} 
int型のmain(){
   int型のT。
  int型M、P。
  scanf関数(" %のD "、&T)。
  一方、(T-- ){ 
     CNT = 0 
     memsetの(根、0sizeof (ルート))。
     memset(木、0はsizeof (木))。
     scanf関数(" %LLD%D%D "、&​​N、&M、&P); 
     vx.clear(); 
     vy.clear(); 
     以下のためにint型私= 1 ; I <= M; iが++ ){ 
        scanf関数(" %d個の%のD "、&ポイント[I] .X、&ポイント[I] .Y)。
        点[i]は.W = CAL(get_val(点[I] .X、ポイント[I] .Y))。
        vx.push_back(点[I] .X)。
        vy.push_back(点[I] .Y)。
     } 
     ソート(点 + 1、点+ 1+ )mは、
     ソート(vx.begin()、vx.end()); 
     ソート(vy.begin()、vy.end()); 
     vy.erase(ユニーク(vy.begin()、vy.end())、vy.end())。
     INT SZ = vy.size()。
     以下のためにint型 I = 1 ; I <= M; iは++ ){
        int型 POSY = LOWER_BOUND(vy.begin()、vy.end()、点[i]は.Y)-vy.begin()+ 1 
        インサート(1、SZ、ルート[I- 1 ]、根[i]は、POSY、ポイント[I] .W)。
     } 
     一方(P-- ){
       int型LX、RX、LY、RY。
      scanf関数(" %D%D%D%D "、&​​LX、LY&、&RX、& RY)。
       LX = LOWER_BOUND(vx.begin()、vx.end()、LX)-vx.begin()+ 1 
       RX = UPPER_BOUND(vx.begin()、vx.end()、RX) - vx.begin()。
       LY = LOWER_BOUND(vy.begin()、vy.end()、LY)-vy.begin()+ 1 
       RY = UPPER_BOUND(vy.begin()、vy.end()、RY) - vy.begin()。
       もし(LX> RX || LY> RY){ 
          のprintf(" 0 \ n " );
          続け; 
       } 
       のprintf(" %LLDする\ n "、クエリ(根[lx- 1 ]、根[RX]、1 、SZ、LY、RY))。
     } 

  }
  リターン 0 ; 
} 
/ * 


* /

 

おすすめ

転載: www.cnblogs.com/bluefly-hrbust/p/11450672.html