ポータル
問題解決のためのアイデア
最初:
私は家の選挙のために、それは家族の前にI-1の値が選ぶだろうことは明らかである、我々は唯一の選挙法の最後を検討する必要が。(問題sの)私の大きな値を選択するかの最大の残りの値を選択します。
我々は、[i]は、I最古MAXSフロントを値の降順に係るいくつかの構造体にそれぞれ(SおよびA)の状況を持って、その後和とプレフィックスを取得しますMAXAとSは、[i]が最大値、すなわち、(S * 2 + a)の最大値を選択した家族のI ... Nを表します。
そして、各I要件については、ANS [i]が
- 私の前の家の最大値を選択してください
- 家族の残りの部分を追加する前に、I-1の最大値を選択してくださいホーム私... nは家への最大の貢献
最大値、すなわち、
ANS [I] = MAX(和[I] + 2 * MAXS [i]は、和[I-1] + MAXA [I]))。
第二:
もちろん、記録ANS答えをので、インクリメントANS iを増加させながら、それぞれの時間は、番号を追加します。
すべての選択肢について、2例に分けることができ、1つの最も遠いアドレスは以下のようになります。
- 最大値になりました。<アドレスを選択しているK、[K]に対する答えの貢献
- 選択したアドレス>今の最大の貢献そのk個の回答、[K] + 2 *への回答の貢献(S [k]は-now)
だから、それぞれが最大を取ることができます。
ここでは、2つの大きなスタックとは、より便利に実現しています。
Q1点はQ2は今正しい場所に格納され、今で左に格納されます。
右への更新ポイントは、その後、ポップQ2、Q1に移動した場合、今の間にすべての点の座標を追加し、座標q2.topを()、そして今、最後に更新された値。
更新は左のポイントである場合、単にポップq1は、Q2は扱われません。
したがって、Q2が行われる各時点で、今よりも小さい座標点の全てを排出する必要があります。
ACコード
1の#include <iostreamの> 2の#include <アルゴリズム> 3の#include <cmath> 4の#include <cstdioを> 5 使って 名前空間STD。 6 のconst int型 MAXN = 100005 。 7 int型N、MAXS [MAXN]、MAXA [MAXN]。 8 構造体ノード{ 9つの int型S; 10 ブール 演算子 <(constのノード&XX){ 11 リターン A> xx.a。 12 } 13 } [MAXN]×。 14 INT和[MAXN]。 15 のint main()の 16 { 17 CIN >> N。 18 のために(int型 i = 1 ; iが<= N; iが++ ){ 19 のscanf(" %dの"、およびX [i]は.S)。 20 } 21 のための(int型 i = 1 ; iが<= N; iが++ ){ 22 のscanf(" %dの"、およびX [I] .A)。 23 } 24 ソート(X + 1、X + N + 1 )。 25 以下のために(int型 i = 1 ; iが<= N; iは++ ){ 26 和[i]は=合計を[I- 1 ] + X [i]は.A。 27 MAXS [I] = MAX(MAXS [I- 1 ]、X [i]は.S)。 28 } 29 のための(int型 I = N; I> = 1 ; i-- ){ 30 MAXA [I] = MAX(MAXA [I + 1 ]、2 * X [i]は.S + X [i]は.A)。 31 } 32 のための(int型 i = 1 ; iがn = <; iは++ ){ 33 のprintf(" %Dの\ nを"は、MAX(SUM [I] + 2 * MAXS [i]は、和[I- 1 ] + MAXA [I])); 34 } 35 リターン 0 ; 36 }
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <アルゴリズム> 4の#include <キュー> 5 使って 名前空間STDを、 6 のconst int型 MAXN = 100005 。 7 INT N。 8つの 長い 長いANS; 9 構造体ノード{ 10 INT S。 11 のint ; 12 ブール 演算子 <(constのノード&P)のconst { 13の リターン 2 *のS + <PS * 2+ PAを。 14 } 15 } D [MAXN]。 16 PRIORITY_QUEUE < 整数 > Q1。 17 PRIORITY_QUEUE <ノード> Q2。 18 ボイドshuchu(){ 19 のprintf(" %LLDする\ n " 、ANS)。 20 } 21 INT メイン(){ 22 CIN >> N。 23 のために(int型 i = 1 ; iが<= N; iが++ ){ 24 のscanf(" %dの"、&D [i]の.S)。 25 } 26 のために(int型 i = 1 ; iが<= N; iが++ ){ 27 のscanf(" %dの"、&D [i]の.A)。 28 } 29 のための(int型 i = 1 ; iが<= N; iが++ ){ 30 q2.push(D [I])。 31 } 32 INTは今= 0 。 33 のために(int型 i = 1 ; iが<= N; iが++ ){ 34 、ノードD2。 35 であれば(!q2.empty()){ 36 D2 = q2.top()。 37 一方(d2.s <今&& q2.empty()!)q2.pop()、D2 = q2.top()。 38 } 39 であれば(q1.empty()){ 40 、ノードD2 = q2.top()。 41 q2.pop()。 42 今= d2.s。 43の ANS + = d2.a + 2 * d2.s- 2 * 今。 44 shuchu()。 45 続け; 46 } 47 であれば(q2.empty()){ 48 INT D1 = q1.top()。 49 q1.pop(); 50の ANS + = D1。 51 shuchu()。 52 続け; 53 } 54 INT D1 = q1.top()。 55 int型 D22 = d2.a + 2 * d2.s- 2 * 今、 56 であれば(D1> D22){ 57 q1.pop()。 58の ANS + = D1。 59 } 他{ 60 q2.pop()。 61 今= d2.s。 62 ANS + =D22; 63である } 64 shuchu(); 65 } 66 リターン 0 ; 67 }
// NOIP2015人気グループT4