問題の意味を2つの含むアレイをn個の要素、Bが与えられると、アレイが最大のp(p <= n)を求め、同じ要素を含まない、及びbは同等であるように、等価本明細書には、[ように定義されますL、R]およびB [L、R]は添字の最小値(1 <= 1 <= R <= P)に等しいです。
ソリューション:
1、pが単調スタックは、Laを取得し、横断する小から大へ、1〜Nの範囲[i]は、[i]が小さい要素をLB [i]は共感度の比を表します。I番目の要素、呂[i]が!=左心室[i]は、iの条件が満たされていない説明を含むセクションを含む、次いでpは、I-1の最大を取ることができる場合。
ACコード:
1の#include <iostreamの> 2の#include <sstream提供> 3の#include <fstreamの> 4の#include <アルゴリズム> 5の#include < ストリング > 6の#include <CStringの> 7の#include <iomanip> 8の#include <cstdlib> 9#含む<CCTYPE> 10の#include <ベクトル> 11の#include <cmath> 12の#include <ctimeの> 13の#include <積層> 14の#include <キュー> 15の#include <地図> 16の#include < 設定 > 17 の#defineMEM(A、B)のmemset(A、B、はsizeof(A)) 18 の#defineランダム(B)(RAND()%(B-A + 1)+ A) 19 の#define ULLのunsigned long長い 20 #定義 2.71828182 E 21 の#defineパイACOS(-1.0) 22 使用 名前空間STDを、 23 のconst int型 MAXN = 1E5 + 5 。 24 int型N、[MAXN]、B [MAXN]。 25 INT ラ[MAXN]、Lbは[MAXN]。 26スタック< 整数 > SA、SB; 27 int型リード() 28 { 29 INT S = 1、X = 0 。 30 CHAR CH = GETCHAR()。 31 一方、 {(isdigit(CH)!)場合(CH == ' - ')S = - 1 ; CH = GETCHAR();} 32 ながら(isdigit(CH)){X = 10 * X + CH- ' 0 ' ; CH = GETCHAR();} 33 リターン X * S。 34 } 35 ボイドのinit() 36 { 37 ながら(!sa.pop()sa.empty())。 38 しばらく(!sb.pop()sb.empty()); 39 のために(int型 I = 1 ; ++; iが<= N I) 40 { 41 ながら(!sa.empty()&& [I] < [sa.top()])sa.pop(); 42 であれば(sa.empty())ラ・[I] = 0 ; 43 他ラ[I] = sa.top()。 44 sa.push(I)。 45 } 46 のための(int型 I = 1 ; ++; iが<= N I) 47 { 48 ながら(!sb.empty()&& B [i]は< B [sb.top()])sb.pop(); 49 であれば(sb.empty())Lbは[I] = 0; 50 他 Lbは[I] = sb.top()。 51 sb.push(I)。 52 } 53 } 54 のint main()の 55 { 56 IOS :: sync_with_stdio(偽)。 57 cin.tie(0); cout.tie(0 )。 58 一方(〜のscanf(" %d個"、&N)) 59 { 60 GETCHAR()。 61 のために(int型 i = 1 ; iが<= N; I ++)[I] = 読み取ります(); 62 以下のために(int型 I = 1 [I] = B I ++; iが<= n)を()読み取ります。 63 INT ANS = N。 64 のinit(); 65 のために(int型 I = 2 ; iが<= N ++ I) 66 { 67 場合(ラ[I] = Lbの[I]) 68 { 69 ANS = I- 1 。 70 ブレーク; 71 } 72 } 73 COUT << ANS << ENDL。 74 } 75 }
統合 |