サマースクールキャンプオフ以上の2019頭の牛(その4)C列(+単調スタック・セグメント・ツリー)

トピックへのリンク: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- 11))* (LL)X、RES)。
102          他の 場合(X < 0 103の              RES = MAX((querymin(I、R [i]は、1)-querymax(L [i]は、I- 11))* (LL)X、RES)。
104      }
 105      ライト(RES); PN。
106      戻り 0 ;
107 }
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/wuliking/p/11261576.html