パワーキューブは、エキゾチックなパワーの隠し場所として使用されています。ありnは n個の都市は、番号1を、2 、... 、nは 1,2、...、nはそれを交換することができました。パワーキューブの取引価格I i番目の都市である私は、キューブごとにドルをaiを。Noswalはフォクシー実業家で、静かにパワーキューブを購入し、転売で幸運を作りたいと考えています。警察によって発見されるのを避けるために、Noswalに行くだろうI i番目の都市と正確に次の3つのオプションのいずれかを選択I i日:1.過ごす私はパワーキューブ購入するドルを愛2.再販を電源キューブと取得
A 私は彼が少なくとも一つのパワーキューブがある場合はドルを愛
3.何もしない
もちろん、Noswalは、同時に複数のパワーキューブを所有することができます。行くの後、n個の n個の都市、彼が戻って家に帰るとすぐ警官からご利用いただけます。彼は稼ぐことができる最大の利益を知りたいです。一方で、リスクを下げるために、彼は最大の利益を得るために(売買含める)取引の回数を最小限にしたいと考えています。あなたは、彼が最初に無限のお金を持っていると仮定することができますので、Noswalは、フォクシー、成功した実業家です。
複数のテストケースはInputThereです。入力の最初の行は、正の整数含まT T(T ≤ 250テストケースの数を示す、T≤250を)。各テストケースのため:
最初の行は、整数を有するN、N。(1 ≤ N ≤ 10 5 1≤n≤105)
二行目は持っているN nは整数1を、2 、... 、n個の A1は、A2、...、どこ私は愛が取引価格を意味します(売買します)パワーキューブのI i番目の都市。(1 ≤私は≤ 10 9)1≤ai≤109を
すべての和が保証される N nは超えないで 5 × 10 5、5×105。
各ケースOutputFor、二つの整数で1行を印刷する-最大の利益と取引の最小時間は最大profit.Sample入力を取得します
3 4 1 2 10 9 5 9 5 9 5 10 2 2 1
サンプル出力
4 16 5 2 0 0 挿入スタックは、実際には2回微分を考えて、実際には一度ポップアップ挿入し、動作しません。
#include <ビット/ STDC ++ H> の#define MME(B)のmemset((A)、(B)はsizeof((A))) 使用 名前空間STDを、 typedefの長い 長いLL。 const int型 INF = 0x3f3f3f3f 。 INT のmain(){ int型ティム。 int型のn; scanf関数(" %のD "、およびTIM)。 一方、(tim-- ){ scanf関数(" %のD "、&N) PRIORITY_QUEUE <ペア< int型、int型 >> Q; LL ANS =0 ; int型 TOT = 0 ; のため(int型 I = 0、X、I <N - ; ++ I){ scanfの(" %のD "、およびX); q.push(make_pair( -X-、1。 )); / / 購入 q.push(make_pair(-X-、2)); // 販売 LL TMP = X + q.top()まず;. IF(q.top()== SECOND。1。 TOT = +)2 ; / / 実際の取引は、購入者は販売に相当する時間であろう ANS + = TMPと、 q.pop(); } printf(" %LLD%D \ n " 、ANS、TOT)。 } 戻り 0 。 }