BZOJ3932] [CQOI2015タスク照会システム&羅区P3168--ツリー部K +小さな差の元会長

トピックリンク:https://www.lydsy.com/JudgeOnline/problem.php?id=3932

BZOJ:制限時間:20秒   メモリ制限:512メガバイト

羅バレー:
制限時間2.00s
メモリ制限500.00メガバイト
 

説明

最近の検査室ではスーパーコンピュータの管理のためのタスク管理システムを準備している、そしてあなたはそれのクエリ部分を完了するために、予定されています。スーパーコンピュータ
タスクトリプル(シリコン、EI、PI)について、シリコン(Si、EI、PI)は、タスクも実行され(第1、第2のSi Eiを第2のタスクの終了後に第2のSi、Eiは秒から開始したことを示し
)、優先度パイ。同時に複数のタスクを同時に実行する必要があり、その優先順位は同じでも異なっていてもよいです。多くの場合、スケジューリングシステムへ
クエリは、事前のKiを取った後、昇順に今後の優先順位のタスク(最小のKi優先度のタスク、西秒のタスクを実行し、尋ねました
)優先度の合計があります。特に、Kiは西秒で実行されているタスクの合計数よりも大きい場合は、直接の答えの最初のタスクは、優先順位を実行しているのXi秒
とのレベル。上記パラメータの全ては、整数、1との間の時間の範囲N(1およびNを含む)です。
 

入力

入力ファイルの最初の行は、二つのスペースで区切られた正の整数mおよびnは、それぞれ、タスクと時間の合計数を表し含ま。その後のm行、3つのスペースを含む各行
独立した正の整数はSi、EiのとPI(Si≤Ei)、タスクを記述する。続いてN行は、各列は4つのスペースで区切られた整数Xiの、愛、Bi及びCIを含みます
クエリを記述します。計算式KI = 1 +(AI *プレ+ BI)MOD CIによって必要とされるKIクエリパラメータ。前のクエリの結果を示し、予め、
最初のクエリのために、事前に1を=。
 
 

出力

合計n個の出力ラインは、各ラインクエリ結果を表す整数。
 

サンプル入力

4 3
1 2 6
2 3 3
1 3 2
3 3 4
3 1 2 3
1 1 3 4
2 2 4 3

サンプル出力

2
8
11

ヒント

 

サンプルの解釈

K1 =(1 + 3 * 1)%2 = 1 + 1

K2 =(1 * 2 + 3)%4 + 1 = 2

KH3 =(2 * 8 + 4%)3 + 1 = 3

データ、1≤m、N、Siの、EI、Ci≤100000,0≤Ai、Bi≤100000,1≤Pi≤10000000の100%に、Xiが1〜n個配置されています

 


 

非常にフレンドリーな中国の顔の問題、別のロスバレーK-値式が間違っ。

質問は、kの単一の小さな値とし、フロントとkの小さな値は、木の会長を考えるのは簡単です初めて顔を求めています。しかし、どのようにメンテナンスの問題があります。シングルポイントへの暴力の直接変更した場合、その後、時間と空間を買う余裕ができないだけでなく、余裕がないことができるだけでなく。だから私は、巨大な巨大な違いを考えました。各時間間隔の変更は頭と尾の端、すなわち更新(ST)、更新(ED + 1)を変更する必要があり、あなたは木の会長は、木の配列のことを学んだしなければならないと信じていることを学ぶとき。だから、確かに私は言っていない、の違いを学びました。

まず私たちは、その後、我々はすべての瞬間の達成のためのx番目のツリーのライン上のクエリに直接行くとき。すべての瞬間には、セクションの開始または終了があり、その後、私たちは直接、この時間の最初と最後に更新されている番号1で表され、-1、1される| -1 * B [POS]その優先順位として、これはありますディファレンシャル、および前記B [POS]は、優先度の離散化の大きさです。

以下のためにINT iが= 1 ; I <= M I ++ ){
     ためINT J = 0 ; J <ST [I] .size(); J ++ ){
         int型、P = LOWER_BOUND(秋+ 1、落下+ 1 + NB、LISを[ST [i]は[J]]) - 秋。
        [版(++ NP] =アップデート1、NB、P、1版、[NP- 1 ])。
    } 
    のためのINT J = 0 ; J <ED [I] .size(); J ++ ){
         int型、P = LOWER_BOUND(秋+ 1、落下+ 1 + NB、LIS [ED [I] [J]) -秋。
        版【 ++ NP] =アップデート(1、NB、P、 - 1版、[NP- 1 ])。
    } 
    最後[I] = 版[NP]。
}

 

しかし、前に各こちらのバージョンを区別することは0-2だけでなく、1になりますので、我々は別のレコードを生成し、i番目の時間の最終バージョンは、ここで見なければならない私が最後を使用します録音

更新機能とクエリ機能は、その後、私は、大きな木のk値が関連しているの間隔の元会長を話さない、そして最終的にリマインダー、各点はロット番号を有していてもよく、そうリットルのクエリ時間== R私たちは、kは、一価の*の数に対応し、残りの数です/ NUM * kは、合計しなければなりません。

以下はコードです:( ACロスバレーAいいえ、詳細は私のブログの説明を参照)

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
 
#defineっ長い長のconst int型 MAC = 1E5 + 10 構造体ツリー
{ 
    LL和。INT サイズ、L、R。
}ツリー[MAC << 6 ]。
int型の LIS版[マック]、秋[MAC]、[MAC * 2 ]。
ベクトル < 整数 > ST [MAC]編[マック]。
INT 最後の[MAC]。
int型 TOT = 0 ; ボイドINTX)
{ int型、F = 0
 
 
 

    
 
 
    ;
    チャー CH = GETCHAR()。
    一方、(CH> ' 9 ' || CH < ' 0 ')CH = GETCHAR()。
    一方、(CH> = ' 0 ' && CH <= ' 9 ')、F =(F << 1)+(F << 3)+ CH- ' 0 '、CH = GETCHAR()。
    X = F。
} 
 
int型のビルド(int型 L、INT R)
{ 
    int型ミッド=(L + R)>> 1 RT = ++ TOT;
    もし(L == R)戻りRT; 
    ツリー[RT] .L = ビルド(L、MID)。
    ツリー[RT] .R =ビルド(MID + 1 、R)。
    返すRT; 
} 
 
int型の更新(int型 L、INT R、INT POS、INTヴァル、INT 当たり)
{ 
    int型 RT = ++ TOT。
    ツリー[RT] = ツリー[あたり]。
    ツリー[RT] .size + =ヴァル;ツリー[RT] .SUM + = 1LL *ヴァル* 落下[POS]。
    もし(L == R)戻りRT;
    int型半ば=(L + R)>> 1 もし(MID> = POS)ツリー[RT] .L = アップデート(L、中間、POS、ヴァル、ツリー[当たり] .L)。
    他のツリー[RT] .R =アップデート(MID + 1 、R、POS、ヴァル、ツリー[当たり] .R)。
    返すRT; 
} 
 
LLクエリ(INT L、INT R、int型 RT、INT K)
{ 
    int型 X = ツリー[ツリー[RT] .L] .size。
    もし(L == R)戻りツリー[RT] .SUM /(1LL *ツリー[RT] .size)* 1LL * K。
    INTの半ば=(L + R)>> 1 もし(x> = k)の戻りクエリ(L、中間、ツリー[RT]・L、K);
    他の リターンクエリ(ミッド+ 1、R、ツリー[RT] .R、KX)+ ツリー[ツリー[RT] .L] .SUM。
} 
 
int型のmain()
{ 
    int型N、M。
    (N)(M)。
    以下のためにINT iが= 1 ; I <= N; I ++ ){
         int型のX、Y、Z。
        (X)(Y)(Z)
        LIS [I] = Z;落下[I] = Z; 
        ST [X] .push_back(I)。
        ED [Y + 1 ] .push_back(I)。
    } 
    ソート(秋 + 1、秋+ 1個の + N)。
    INT NB =ユニーク(秋+ 1、+落ちる1 -fall- + n)は1 
    版[ 0 ] =ビルド(1 、NB)。
    int型 NP = 0 ;
    以下のためにINT iが= 1 ; I <= M I ++ ){
         ためINT J = 0 ; J <ST [I] .size(); J ++ ){
             int型、P = LOWER_BOUND(秋+ 1、落下+ 1 + NB、LISを[ST [i]は[J]]) - 秋。
            [版 ++ NP] =アップデート(1、NB、P、1、版[NP- 1 ])。
        } 
        ためINT J = 0 ; J <ED [I] .size(); J ++ ){
             int型、P = LOWER_BOUND(秋+ 1、+落ちる1 + NB、LIS [EDを[I] [J]) - 秋。
            版【 ++ NP] =アップデート(1、NB、P、 - 1版、[NP- 1 ])。
        } 
        最後[I] = 版[NP]。
    } 
    あたりLL = 1 以下のためにINT iは= 1 ; I <= M; I ++ ){
        INT X、A、B、C。
        (X)における(A)(B)(C)
        LL K =(1LL * + Bあたり*)%C + 1 もし(ツリー[最後[X]サイズ<= K)あたり= ツリー[最後[X]]和。
         =クエリ(につき1 、NB、最後に[X]、K)。
        printf(" %のLLD \ n " 、パー); 
    } 戻り0 
}
     

 

 

 

おすすめ

転載: www.cnblogs.com/lonely-wind-/p/11891451.html