単調なキュー
zhk手書きモノトーンキュー定義:
最初に 、L = R = 0
(L、R]は 有効な元素であります
左端の要素の削除 ++リットルを
削除右端の要素 、-R
有効なキュー要素:Lは+ 1 <= R&LT。 、すなわち L <R
最左点取る Q [L + 1]
右端点取る Q [R]を
書式#include <iostreamの> の#include <cstdioを> #defineは、 int型の登録RI の#define U int型 名前空間のOPT { Uインラインでの(){ UX(0)、F(1 )。 チャーS(GETCHAR())。 一方、(S < ' 0 ' || S> ' 9 ' ){ もし、(S == ' - ')、F = - 1 。 S = GETCHAR()。 } 一方、(S> = ' 0 ' && S <= ' 9 ' ){ X =(X << 1)+(X << 3)+ S- ' 0 ' 。 S = GETCHAR()。 } リターンのx * F; } } 使用してオプトインを:: で、 #define NN 1000005 書式#include <アルゴリズム> 名前空間の主力{ UQ [NN]、[NN]、L、R、N、ANS。 インラインボイド{)(解きます Nは = に(); 用(RI I(1); I <= N; ++ I)[I] = [I + N] = において(); 用(RI I(1); I <=(N << 1); ++ I){ 一方(L + 1 <= R && Q [L + 1 ] <I-(N >> 1))++ L。 もし(L + 1 <= r)はANS = STD :: MAX(ANS、[Q [L + 1 ]] - Q [L + 1 ] + I + [I])。 一方、(L + 1 <= R && [Q [R] - Q [R] <= [I] -i) - R。 Q [ ++ R] = I。 } std :: coutの << ANS; } } INT メイン(){ // freopenは( "X.TXT"、 "R"、STDIN)。 std ::イオス:: sync_with_stdio(偽); 主力::(解決)。 }