トピックリンク:https://www.lydsy.com/JudgeOnline/problem.php?id=3932
BZOJ:制限時間:20秒 メモリ制限:512メガバイト
説明
入力
出力
サンプル入力
1 2 6
2 3 3
1 3 2
3 3 4
3 1 2 3
1 1 3 4
2 2 4 3
サンプル出力
8
11
ヒント
非常にフレンドリーな中国の顔の問題、別のロスバレー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 ; ボイド中(INT&X) { 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 。 }