トピックへのリンク:https://ac.nowcoder.com/acm/contest/884/C
溶液:最小値として現在の点までの各点の配列の列挙は、単調にスタックを達成することができる右側の現在位置を特定するために、その左側よりも小さくを実現することができるされている最初のポイントに現在のポイントを見つけるためにそれよりも小さい点、その後プレフィックスの確立およびセグメントツリー。[I] [I]と、その右側のプレフィックスと最大値実現可能な間隔を見つける接頭辞と最小値マイナスその左可能範囲を見つけることに等しい0未満である場合、最終的に、n個の点の横断それは、実現可能な間隔プレフィックスとその左側のセクションプレフィックスでその最小値の可能な減少を見つけて、最大値を見つけ、このNの値を比較し、答えである最大値をとる権利に等しい0より大きい。
ACコード:
言語:C ++コードサイズ:2681実行時間:2123ミリ秒のメモリを取る:267912K
1つの#include <ベクトル> 2の#include <cstdioを> 3の#include <iostreamの> 4の#include <cmath> 5の#include <キュー> 6の#include <積層> 7 の#define numm CH-48 8 の#defineのPdのputchar(」 ') 9 の#defineのPNのputchar('の\ n ') 10 の#define PB一back 11 の#define Fiの最初の 12 の#define SE第 13 の#define FRE1 freopenは( "1.TXT"、 "R"、STDIN) 14 の#define fre2 freopenは( "2.txt"、 "W"、 STDOUT) 15 使って 名前空間はstd; 16テンプレート<型名T> 17 空隙リード(T&RES){ 18 ブールフラグ= 偽。char型のCH; 19 一方(isdigit(CH = GETCHAR())!)(CH == ' - ')&&(フラグ= 真)。 20 のために(RES = numm; isdigit(CH = GETCHAR()); RESの=(RES << 1)+(RES << 3)+ numm)。 21 フラグ&&(RESの= - RES)。 22 } 23テンプレート<型名T> 24 ボイドライト(T x)から{ 25 もし(x < 0)のputchar(' - ')、X = - X。 26 であれば(X> 9)書き込み(X / 10 )。 27 のputchar(Xの%10 + ' 0 ' )。 28 } 29 のconst int型 MAXN = 3000010 。 30 のconst int型 N = 1010 。 31 CONST INT INF = 0x3f3f3f3f 。 32のtypedef 長い 長LL。 33 構造体ノード{ 34 のint L、R。 35 LLのミネソタ州、MAXX。 36 }ツリー[MAXN << 2 ]。 37 LL和[MAXN]。 38 INT [MAXN]、B [MAXN]。 39 INT L [MAXN]、R [MAXN]。 40 int型のn; 41 ボイド押し上げ(INT CUR){ 42 ツリー[CUR] .minn =分(ツリー[CUR << 1 ] .minn、ツリー[CUR << 1 | 1 ] .minn)。 43 ツリー[CUR] .maxx = MAX(ツリー[CUR << 1 ] .maxx、ツリー[CUR << 1 | 1 ] .maxx)。 44 } 45 空隙ビルド(int型 L、INT R、INT CUR){ 46 ツリー[CUR] .L = L。 47 ツリー[CUR] .R = R。 48 であれば(L == R){ 49 ツリー[CUR] .minn =ツリー[CUR] .maxx = 和[L]。 50 リターン; 51 } 52 INT半ば=(L + R)>> 1 。 53 ビルド(L、中間、CUR << 1 )。 54 ビルド(ミッド+ 1、R、CUR << 1 | 1 ); 55 突き上げ(CUR)。 56 } 57 LL querymax(INT QL、INT QR、INT CUR){ 58 であれば(QL <=ツリー[CUR] .L &&ツリー[CUR] .R <= QR) 59 戻りツリー[CUR] .maxx。 60の LLのRES = - 1E18。 61 であれば(QL <=ツリー[CUR << 1 ] .R)RES = MAX(querymax(QL、QR、CUR << 1 )、RES)。 62 であれば(QR> =ツリー[CUR << 1 | 1 ] .L)RES = MAX(querymax(QL、QR、CUR << 1 | 1 )、RES)。 63 リターンのres; 64 } 65 LL querymin(INT QL、INT QR、INT CUR){ 66 であれば(QL <=ツリー[CUR] .L &&ツリー[CUR] .R <= QR) 67 戻りツリー[CUR] .minn。 68 LL RES = 1E18。 69 であれば(QL <=ツリー[CUR << 1 ] .R)RES =分(querymin(QL、QR、CUR << 1 )、RES)。 70 であれば(QR> =ツリー[CUR << 1 | 1 ] .L)RES =分(querymin(QL、QR、CUR << 1 | 1 )、RES)。 71 リターンのres; 72 } 73スタック< int型 > S; 74 のint main()の 75 { 76 リード(N) 77 のために(int型 i = 1 ; iが<= N; iが++ ) 78 リード([I])。 79 のために(int型 i = 1 ; iが<= N; iが++ ){ 80 リード(B [I])。 81 和[I] =和[I- 1 ] + (LL)B [i]は、 82 } 83 ビルド(0、nは、1 )。 84 のための(int型i = 1 ; iが<= N; iが++ ){ 85 ながら(!s.empty()&& [s.topは()]> = [I])s.popを(); 86 であれば(s.empty())L [I] = 0 ; 87 他 L [I] = s.top()。 88 s.push(I); 89 } 90 ながら(!s.empty())s.pop(); 91 のために(int型 ; I> = I = N 1 ; i-- ){ 92 ながら(!s.empty()&& [s.topは()]> = s.pop()[I])を、 93 であれば(s.empty())R [I] = N。 94 他R [I] = s.top() - 1 ; 95 s.push(I)。 96 } 97 のLLのRES = - 1E18。 98 のためには、(int型 i = 1 ; iがn = <; iは++ ){ 99 、INT X = [I]。 100 であれば(X> 0 ) 101の RES = MAX((querymax(I、R [i]は、1)-querymin(L [i]は、I- 1、1))* (LL)X、RES)。 102 他の 場合(X < 0 ) 103の RES = MAX((querymin(I、R [i]は、1)-querymax(L [i]は、I- 1、1))* (LL)X、RES)。 104 } 105 ライト(RES); PN。 106 戻り 0 ; 107 }