問題の意味:特定の式$ <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()。 アップデート(1、0、CNT、X [i]は、Y [1] - 1 )。 printf(" %LLDする\ n "、クエリ(1、0、CNT、(SZ [ 1 ] + 1)/ 2 ))。 } }