•参考資料
•問題の意味
長さnの配列から、$ \ FRAC和よう{N} {3} $隣接していない最大値を(両方を同時に取ることができない)で抽出
•問題解決
欠失は(A_L $ $)、及びその右(A_R $ $)これらの3つの数字の左側などの$ A_ {最大} $を含むながら、現在の最大貪欲の$ A_ {最大} $を選択します。
しかし、我々が$ A_ {最大} $にこの番号を選択せず、$ a_l、A_R $これら2つの数値を選択する必要があります$ a_l + A_R> A_ {最大} $、ということも可能です。
したがって、我々はまた、$ a_l + A_R-A_ {最大}考慮すべき系列に$する必要があります。
その左と番号を削除する権利毎に、その左下とその右の位置で電流を記録するための2つの列の$ L、Rの$マークであってもよいです。
•コード
コードの表示1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#defineっ長い長 4 の#define PLL対<-1,11,11-> 5 の#define F第 6 の#define S第 7 のconst int型 MAXN = 1E5 + 50 。 8 9 INT N。 10 LL [MAXN]。 11 のint L [MAXN]。 12 INT R [MAXN]。 13 セット <PLL> _set。 14 15 空隙デル(int型X) 16 { 17 _set.erase({[X]は、X})。 18 L [Rの[X] = L [X]。 19 R [Lの[X] = R [X]。 20 } 21 LL)(解決 22 { 23 のための(int型 i = 1 ; iが<= N; ++ I) 24 { 25 L [I] =(I- 1 + N- 1)%N + 1 ; 26 R [I] =%I N + 1 。 27 _set.insert({[i]は、I})。 28 } 29 30 LL ANS = 0 。 31 のために(int型 i = 1 ; iが<= N / 3 ; ++ i)が 32 { 33の ANSは+ = _set.rbegin() - > F。 34 35 INT X = _set.rbegin() - > S。 36 のLL B = [Lの[X]]。 37 LLのC = [X]。 38 のLL D = [R [X]]。 39 40 デル(L [X])。 41 デル(R [X])。 42 _set.erase({[X]は、X})。 43 44 [X] = B + D- C。 45 _set.insert({[X]は、X})。 46 } 47の リターンANS。 48 } 49 のint main()の 50 { 51 のscanf(" %d個"、&N) 52 のために(int型 i = 1 ; iが<= N ++ I) 53 のscanf(" %のLLD "、A + I)。 54 のprintf(" %LLDする\ n " 、解決())。 55 56 戻り 0 ; 57 }