以上の2019頭の牛オフサマースクールキャンプ(七)E +個別のセグメントツリー

トピックポータル

問題の意味:特定の式$ <L、R> $、番号LとRの配列に結合された各に従って番号が与えられ、中央値を出力します。

思考:各ので、[1,2)$と$ [2,3)$ [1,2] $ $なる$など、$ $離散間隔が必要[1,3)$、$です発現の完全な範囲を行うために、または[2,2]として、このセクションでは、問題になります。

  私たちはそれぞれ$ [L、R + 1)$の別個の、数は$(x)は$ xは離散、各更新時間を表して設けられ、右の間隔は$(R + 1)-1 $でなければなりません。例えば、[2,3] $だけ間隔$を持っていた、我々は、離散化した後、我々は間隔を更新し、$ [2,4)$の中で発現$ [1,1] $、プラス桁数が$ [VEのさ2]、[1] $を-ve元の配列でありまし。

  同じ考えを照会して更新します。

#include <ビット/ STDC ++。H>
 の#define CLR(B)のmemset(A、B、はsizeof(A))
 の#define PB(a)の一back(A)
 の#define(のための担当者(I、X、n)とI = xをint型、iが<= N; ++ I)
 の#defineためDEP(Iは、N、X)(INT I = N; I> = X; - I)の
 使用 名前空間STD。
typedefの長い 長いLL。
INTのN、M。
const  int型 INF = 0x3f3f3f3f const  int型 MAXN = 4E5 + 10 
LL X [MAXN]、Y [MAXN]、A1、B1、C1、M1、A2、B2、C2、M2。
ベクトル <LL> VEの。
LL SZ [MAXN << 3 ]、怠惰[MAXN << 3 ]。
ボイド追加(INT O、int型の L、int型のR、LLのF){ 
    SZ [O] + =([R + VEの1 ] -ve [L])* F。
    怠惰[O] + = F。
} 
ボイドプッシュダウン(int型、O INTの L、INT R){
     場合(!怠惰[O] || L == R)のリターン;
    INT半ば=(L + R)>> 1 
    (Oを追加 << 1 、L、中間、怠惰[O])。
    追加(O << 1 | 1、中間+ 1 、R、怠惰[O])。
    怠惰[O] =0 ; 
} 
ボイド更新(int型、O INTの L、INT R、INT QL、INT QR){
     場合(QL <= L && R <= QR){ 
        (R、O、Lを加える1 )。
        返します
    } 
    INT半ば=(L + R)>> 1 
    プッシュダウン(O、L、R)。
    もし(QL <= MID)更新(<< O 1 、L、中間、QL、QR)。
    もし(MID <QR)更新(O << 1 | 1、中間+ 1 、R、QL、QR)。
    SZ [O] = SZ [O << 1 ] + SZ [O << 1| 1 ]。
} 

LLクエリ(INT、O INTの L、INT R、INT NUM){
     場合(L == R){ 
        LL TOT = SZ [O] /([L + VEの1 ] - [L]をVE)。
        リターン [L] +(num- VEの1)/ TOT。
    } 
    プッシュダウン(O、L、R)。
    INT半ば=(L + R)>> 1 もし(SZ [O << 1 ]> = NUM)戻りクエリ(O << 1 、L、中間、NUM)。
    返すクエリを(O << 1 | 1、ミッド+1、R、NUM-SZ [O << 1 ])。
} 


int型のmain(){
     int型N; 
    scanf関数(" %のD "、&N)
    scanf関数(" %LLD%LLD%LLD%LLD%LLD%LLD "、およびX [ 1 ]、・X [ 2 ]、&A1&B1、およびC1&M1)。
    scanf関数(" %LLD%LLD%LLD%LLD%LLD%LLD "、&​​Y [ 1 ]、&Y [ 2 ]、&A2&B2、およびC2、およびM2)。
       担当者(I、3 
        Y [I] =(A2の* yを[I- 1 ] + B2 * Y [I- 2 ] + C2)%M2。
    } 
    
    担当者(I、1 、N){ 
        X [i]を ++、Y [i]は++ ;
        もし(X [i]が> Y [i])とスワップ(X [i]は、Y [I])。
        ve.push_back(X [I])。ve.push_back(Y [I] + 1 )。
    } 
    ソート(ve.begin()、ve.end())。
    ve.erase(ユニーク(ve.begin()、ve.end())、ve.end())。
    INT CNT = ve.size()。
    担当者(I、1 、N){ 
        
          X [i]は = LOWER_BOUND(ve.begin()、ve.end()、[I] X) - ve.begin()。
        Y [i]は = LOWER_BOUND(ve.begin()、ve.end()、Y [I] + 1) - ve.begin()。
        アップデート(10、CNT、X [i]は、Y [1] - 1 )。
        printf(" %LLDする\ n "、クエリ(10、CNT、(SZ [ 1 ] + 1)/ 2 ))。
    } 
}

 

おすすめ

転載: www.cnblogs.com/mountaink/p/11327719.html