P3527 [POI2011] MET-流星全体の二分

  すべての点リングの与えられたポイントの後、各ノードは、母国、k個の事件、毎回[L、R]右の間隔で少しずつ加え、どのように多くの操作を求めて最初の国のそれぞれの値を持っています右の値に達することができます

 

非常に良い全体的なテンプレート半タイトル

修正や問い合わせは、すべての(問い合わせがの第1の変形例であるため)除算の構造の内側に一緒に投げられ、そのようなことなく、この問題を克服する前ので、コードの量多くを減らす(ただし、テンプレートのタイトルの前にすることができる唯一のパーティションに頼まなければこの二分法に適していない範囲が高すぎる場合、範囲を通過する前で、この問題の複雑さは、値ドメインの自然の半分が、操作の数ではありません!)

 

ツリー内の配列は、2つの値を追加するために要求されたときながら(すなわち鎖に展開)処理間隔の左端は右端点の右端プラス間隔の長さより大きい場合、リングが与えられることに注意してください(値)mよりもう一つの大きな

 

右側の境界+1をジャンプして右の境界を満たさない時間の1半分

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define担当者(I、B)(I =(A)がINT;方には<=(B); iが++)
 の#define repp(I、B)(I =(A)がINTのために、I> = (B); - I)
 の#defineは長い長いっ
 の#defineは(X)(CERR <<(#X)<< '=' <<(X)<< ENDL)を参照
 の#define INF 0x3f3f3f3f
 の#define CLR( 、V)のmemset(A、V、はsizeof A)
 ///////////////////////////////// / 
CONST  INT N = 2E6 + 10 INTのN、M、ANS [N]、祚[N]、あなた[N]、POS、ヘッド[N]、K、X; 
LL V [N]、T [N]。
構造体のエッジ{ INT NEX、へ;}エッジ[N << 1 ]。
空隙追加(INT A、INT B){エッジ[++ POS] =(エッジ){B、ヘッド[A]};ヘッド[A] = POS;}
 ボイドアップノード(int型のx、int型 V){ ため(; X <= Nであり、X + = X&-x)T [X] + = V;} 
LL qsum(INT X){LL ANS = 0(; X; X - = X&-x)ANS + = T [X]。戻りANS;}
 構造体ノード{LLのID、必要;} S [N]、TEMP1 [N]、TEMP2 [N]。

ボイドは、(解決int型 L、INT R、int型の L、INT R)
{ 
    場合(L> R)のリターン;
    もし(L == R){担当者(I、L、R)ANS [S [i]は.ID] = L。返す;}
     int型ミッド=(L + R)>> 1 
    担当者(I、L、ミッド)アップノード(ズオ[i]は、V [i])と、アップノード(あなた[i]が + 1、 - V [i])と、
    int型 CNT1 = 0、CNT2 = 0 ; 
    担当者(I、L、R)
    {     
        LL和 = 0 INT J =頭部[S [i]の.ID]; J &&和<= sの[I] .need; J = エッジ[J] .nex)
        合計 + = qsum(エッジ[J] .TO)+ qsum(エッジ[J] .TO + M)。
        もし(和> = S [i]の.need)TEMP1 [++ CNT1] =のS [i]は、
        TEMP2 [++ CNT2] = sの[I]、TEMP2 [CNT2] .need- = 和。
    } 
    担当者(I、L、MID)アップノード(Zuoの[I]、 -v [i])と、アップノード(あなた[I] + 1、V [I])。// 谁污染谁治理
    
    担当者(I、1、CNT1)の1- [ 1 = I +] TEMP1 [I]。
    担当者(I、1、CNT2)S [L + cnt1- 1 + I] = TEMP2 [I]。
    解決(L、中、L、L + cnt1- 1)、解決(MID + 1、R、L + CNT1、R)。
} 
int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N、&M)。
    担当者(I、1、M)のscanf("%のD "& ; X)、(X、I)を追加
    担当者(I、1、N)のscanf(" %のLLD "&S [i]の.need)、S [i]は.ID = I; 
    scanf関数("を%のD "& K)、
    担当者(I、1、K){scanf関数(" %D%D%LLD "、&祚[i]は、&あなた[i]は、&​​V [i])と; もし(あなた[I] <祚[I])を使用すると、[I] + = M;} 解決1、K + 11 、n)は、
    担当者(I、1 、n)の
     場合(ANS [I] == K + 1)のprintf(" NIE \ N " );
    のprintf(" %d個の\ nを" 、ANS [I]);
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/bxd123/p/11547889.html