質問の意味:
入力n個の2つの配列の代表であり、nは、次に満たすようにあなたは、p <= Nを見つけることを聞かせて(1 <= 1 <= R <= p <= n)は、(Lことを可能にします同じ最小屈折率の2つの配列の内側部分において、R)
ソリューション:
私はいつも突然、彼はまたになることを見出し、出発点の間隔が1リットルとなっていることを考えたT_T
pは毛布に対して1確かです
pが1より大きい場合、我々は2つのだけのアレイ満たさ左側上の各位置の第1極小の位置を決定する必要がある、同じ場所を発見していない同じであり、その位置は、最大pは、このその後、同じことが、同じ最小部の大セルの位置との間を順次最小位置によって実証することができます
我々は(4)最小レンジ位置を証明するものと
最小3の同じ位置における前提条件(3,4)、(3)最小位置
ソリューション:
次に、最小の(3,4)の位置がこの範囲に見出される3であり、そして二つの部分(1,3)の最小位置と同じなので、全体の(4)項では、最小位置と同じです
コード:
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <iostreamの> 4の#include <キュー> 5の#include <アルゴリズム> 6の#include <ベクトル> 7の#include <積層> 8 使って 名前空間STDを; 9 のconst int型 MAXN = 1E5 + 10 。 10 INT [MAXN]、B [MAXN]、ラ[MAXN]、LB [MAXN]。 11スタック< 整数 > SA、SB; 12 のint main()の 13 { 14 INT N。 15 しばらく(〜のscanf(" %d個"、&N)) 16 { 17 のための(int型 i = 1 ; iが<= N; ++ I) 18 { 19 のscanf(" %dの"、および[I])。 20 } 21 のための(int型 i = 1 ; iは= N <; ++ I) 22 { 23 のscanf(" %dの"、&B [I])。 24 } 25 中(!sa.empty())sa.pop(); 26である ため(INT I = 1 ; I <= N; ++ I) 27 { 28 ながら!(sa.empty()&& A [I]は< A [SA。トップ()])sa.pop(); 29 IF(sa.empty())ラ・[I] = 0 ; 30 他のラ[I] = sa.top(); // 左は最初よりも小さい取得それ番号 31である ; sa.push(I)// 彼の左に対する場合には、左または望ましい数の数よりも大きい数以上であると 32 } 33は 、一方(!sb.empty())sb.pop (); 34である ため(INT I = 1 ; I <= N; ++ I) 35 { 36 ながら(sb.empty()&& B [i]は、<!B [sb.top()])sb.pop(); 37 であれば(sb.empty())LB [I] = 0 ; 38 他の LB [I] = sb.top()。 39 sb.push(I)。 40 } 41 INT ANS = 1 。 42 のために(int型 I = 2 ; ++; iが<= N I) 43 { 44の 場合(LA [I] == LB [i])とANS = I。 45 他に ブレーク。 46 } 47 printf(" %d個の\ n " 、ANS)。 48 } 49 リターン 0 。 50 }