調査基準としてブルーブック、学習の積み重ね
例1:
スタック、支持プッシュを実現するために、ポップとGetMin(最小値クエリースタック)(1)Oで完了する
:思考アルゴリズムの
2つのスタックの最小値は、確立された、各データの先頭にスタックの底部に記憶された記憶された元データ、B
B.でプッシュ(X)、AにおけるXが挿入され、挿入された分(スタックデータB、X)GetMinは出力のみB.top()缶を実行する必要があります
2例:
入力 8 I 2 I -1 I 1 Q 3 L D R Q 2 出力 2 3
スタックアルゴリズム//の上部 の#include <ビット/ STDC ++ H.> 使用して名前空間STD; CONST INT = INF -0x3F3F3F3F; CONST INT MAXN = 1000010; // INT S1 [MAXN]; // INT S2 [MAXN]; int型SUM 【MAXN]; //数xの前と のint F [MAXN]; //最大連続フロントの数であり、x INTのmain(){ int型CAS; !一方(scanfの( "%のD"、およびCAS)EOF = ){ memsetの(SUM、0、はsizeof(SUM)); のmemset(F、INF、はsizeof F); INT POS1 = 0; // INT POS2 = 0; スタック<整数> S1、 スタック<整数> S2; 一方( cas--){ 文字列s、 s.resize(5); scanfの( "%のS"、&S [0]); IF(S [0] == '私') { // cinを>> S1 [++ POS1]。 int型温度; scanf関数( "%dの"、および温度)。 // coutの<< 666 << "" <<一時<<てendl; s1.push(TEMP)。 POS1 ++; 和[POS1] =和[POS1 - 1] + TEMP。 F [POS1] = MAX(F [POS1 - 1]、和[POS1])。 // COUT << POS1 << "III" << F [POS1] << ENDL。 } そうであれば(S [0] == 'D'){ // pos1--。 (s1.empty())であれば 、継続 pos1--; s1.pop(); } であれば(S1。 //もし(!POS1 = 0){ // S2 [++ POS2] = S1 [pos1--]。 //} pos1--。 INTのTEMP = s1.top()。 s1.pop(); s2.push(TEMP)。 } 他(S [0] == 'R'){もし あれば(s2.empty()!){ // S1 [++ POS1] = S2 [pos2--]。 //和[POS1] =和[POS1 - 1] + S1 [POS1]。 // F [POS1] = MAX(F [POS1 - 1]、和[POS1])。 INTのTEMP = s2.top()。 s2.pop(); s1.push(TEMP)。 POS1 ++; 和[POS1] =和[POS1 - 1] + TEMP。 F [POS1] = MAX(F [POS1 - 1]、和[POS1])。 } } そうであれば(S [0] == 'Q'){ int型のX; scanf関数( "%のD"、&x)は、 printf( "%dの\ n"は、F [X])。 } } } }
例3:スタックの一連の問題とアウト
カタラン数は、理論的な計算の数は、知識を必要とする計算C(2N、N)/(N + 1)を用いて定義されます。
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 以下のための#defineモミ(I、B)(INT iが=; I <= B; I ++) の#define LL長い長い CONST LL M = 1E9; // M为压位的最大值 LL A [60004] L、和[120004]。 int型のn; 無効プライム(int型B、INT F) { のために(int型J = 2; J * J <= B && B = 1;!J ++)//质因数分解。 (B%以下J == 0)、一方 { 和[J] + = F。 B / = J; } IF(B) の合計[B] + = F。 } ボイド高(LL C) { (I ++; I <= L INT iが= 1)のための [I] * = C。 以下のために(INT I = 1; I <= L; I ++) [I + 1] + = [I] / M [i]の%= M; //我们需要压缩位置快速处理 一方([L +1]) + +1。 } のIntメイン() { A [1] = 1、L = 1、。。 scanfの( "%のD"、およびN-); のための(INT I = 1; I <= N; I ++)は、分割された2つのための組み合わせの//数、我々はこの質問に対処するために、高速な素因数分解法を使用します。 プライム(N-I + ,. 1); のため(int型I = 2; I <= N + 1; I ++) 首相(I、-1); 用(INT I = 2; I <= N-2 *、I ++) のための(LL J = 0; J <SUM [I]; J ++) 高(I); //精度 のprintf( "%のLLD"、 A [L]); Iは、L-LLを=(1; I; - I) のprintf( "%の09lld"、A [I]); //出力 戻り0; }
例IV:
PS:私は(気持ち形而上学エラーという)間違っているアルゴリズム上の別の日の調査研究を==持っています
// //の#include <ビット/ STDC ++ H> //の#include <cstdioを> //の#include <アルゴリズム> //名前空間stdを使用。 // typedefの長い長いLL。 // constのint型MAXN = 100010; // LL [MAXN]。 // int型のmain(){ // INT N。 //一方((scanf関数( "%のD"、&N)= EOF)&& N!){ (のsizeof、0)//のmemset。 //ため(INT iが= 0、I <N; ++ I){ //のscanf( "%のLLD"、および[I])。 //} // LL P。 // [N + 1] = P = 0。 // LL S [MAXN]; LL W [MAXN]。 // S [0] = [0]。 // W [0] = 1; // LL ANS = 0; //(INT iについては、= 1; I <= N + 1。 //もし([I]> S [P]){ // S [++ P] = [I]。 // [P] = 1ワット。 //} //他{ // LL幅= 0。 //一方、(S [P]> [I]){ //幅+ = [P] W。 // ANS = MAX(ANS、(LL)幅* S [P])。 // - P; //} // S [++ P] = [I]。 // [P]、W =幅+ 1。 //} //} //のprintf( "%のLD \ n"は、ANS)。 //} //} の#include <iostreamの> する#include <cstdioを> する#include <スタック> 名前空間STDを使用して、 長い長いLLのtypedef。 CONST LL MAXN = 1E6 + 5。 スタック<整数>秒; 整数nは、X。 LL [MAXN]、M、ANS、右[MAXN]、左[MAXN]。 INTメイン(){ ながら(〜のscanf( "%d個"、&n)は、N){ ANS = 0。 [0] = -1。 [N + 1] = -1。 {(; I <= N I ++ iは1 = LL)のため のscanf( "%のLLD"、および[I])。 } ながら(!s.empty()){ s.pop()。 } //从左向右 s.push(0)。 以下のための(iは= LL 1、I <= N; I ++){ ための(X = s.top(); [X]> = [I]; X = s.top()){ s.pop() ; } 左側の[I] = X + 1。 s.push(I); } ながら(!s.empty()){ s.pop()。 } //从右至左 s.push(N + 1)。 以下のための(iはN = INT; I> 0; i--){ ため(X = s.top(); [X]> = [I]; X = s.top()){ s.pop( ); } 右[I] = X - 1。 s.push(I); IF((右[I] -左[I] + 1)* [I]> ANS){ ANS =(右[I] -左[I] + 1)* [I]。 } } のprintf( "%のLLD \ n"は、ANS)。 } 0を返します。 }