質問A:D
制限時間:1秒 メモリ制限:512メガバイト
フェイス質問
彼は公に質問に直面して減少しました。
問題の解決策
ゲーム中にカットオフが、プロセスは非常に曲がりくねっています。
貪欲は良いアイデアをしたいです。しかし、最初はそれが間違っ単一のピークだと思いました。実際には、いくつかのピークは可能性があります。
三分のが、それはほとんどの周辺機器、大きなサンプルぞっと間違っていると思う、その後に、半分を開くWQSを書いて、会長に木を書き換えます。
話を戻そう。
ポジティブなソリューション貪欲ヒープを+。木の会長も達成することができます。私は木の会長で言うでしょう。
最初は貪欲です。いくつかの最小限の除去メートル最小の数$ AI $、$ BI $を削除するために削除する必要があります。
だから私は、リスト上の裸の第k-数を行うの背面に、$の前に$列挙を削除し、$ AI $ソートで考慮。
#include <ビット/ STDC ++ Hは> の#defineは長いlong int型 の#define RINTレジスタINTを 使用して、 名前空間STDを、 const int型 N = 100005 ; インラインボイド読み取る(INT&A) { A = 0。INT B = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')B = - 1 ; CH =GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 '){A =(<< 3)+(<< 1)+ CH- ' 0 ' ; CH = GETCHAR();} A = A * B。返します。 } int型T、N、M、ANS。 構造体ノード{ int型、B;} MU [N]。 INTのルート[N]、LS [N << 6 ]、RS [N << 6 ]、S [N << 6 ]、SZ。 インラインブール CMP(ノードA、ノードB){ 戻り Aaの< Baのを、インサート(int型のx、int型&Y、int型の L、INT R、INT V) { Y = ++ SZ。 S [Y] = sで[X] + 1 。 もし(L == R)のリターン; LS [Y] = LSを[X]; RS [Y] = RS [X]。 INT半ば=(L + R)>> 1 。 場合(V <= MID)(LS [X]、LS [Y]、L、中、V)を挿入します。 他の挿入(RS [X]、RS [Y]、ミッド+ 1 、R、V)。 } インラインINT get_rank(INT K、int型の L、INTR、INT X) { もし、(R == x)をリターンS [k]は、 INT半ば=(L + R)>> 1 。 もし(x <= MID)戻りget_rank(LS [k]は、L、中、X)。 他 リターン S [LSは、[K] + get_rank(RS [k]は、中間+ 1 、R、X)。 } インラインINTは(ASK int型 L、INT R、INT V) { int型 X =ルート〔L- 1 ]、Y = ルート[R]を。 int型、L = 1、R = N。 一方、(L <= R) { INT半ば=(L + R)>> 1 。 INT、T = get_rank(Y、1、N、MID)-get_rank(X、1 、N、MID)。 もし(T> = V)、R =半ば1 。 他リットル=ミッド+ 1 ; } 戻りL。 } main()の符号付き { // freopenは( "1.in"、 "R"、STDIN)を、 // freopenは( "s1.out"、 "W"、STDOUT)。 (T)を読み出します。 ながら(T-- ) { ANS = SZ = 0 ;(n)を読み取り、(m)を読み出します。 ための RINT I =(1 ; iが<= N; ++I) (MU [I] .A)、.B)[I](MUを読み取る読み取ります。 ソート(MU + 1、μ+ N + 1 、CMP)。 ため(RINT i = 1 ; iが<= N; ++ I) 挿入(ルート[I - 1 ]、根[i]は、1 、N、ミュー[I] .B)。 用(RINT I = 0 ; I <= M; ++ I) ANS = MAX(ANS、ミュー[I + 1 ] .A *尋ねる(I + 1、N、M-I + 1 ))。 printf(" %LLDする\ n " 、ANS)。 } }
PS。私はこんにゃくはトーナメントの被写体に書いたビート数の一人です。ただ、映画でそれを発見した233のメモリに、ああ、約2万セットを取りました。