ほとんどソートされた配列
制限時間:2000分の4000 MS(Javaの/その他)メモリの制限:262144分の262144 K(Javaの/その他)の合計提出(S):9982受理提出(S):2329
問題の説明
、クイックソート、マージソートヒープソート、挿入ソート、選択ソート、バブルソートなどしかし、時にはほとんどソートされた配列のためにこれらのアルゴリズムを使用するための過剰です:我々は、すべてのソートアルゴリズムに精通しています。
私たちは、その要素が非減少順または非増加順になっている場合は、配列をソートすると言います。我々はそれから正確に一つの要素を削除することができ、そして残りの配列がソートされている場合、配列がほとんどソートされ言います。今、あなたは、配列A1、A2、...、それはほとんどソートさを与えていますか?
入力
最初の行は、テストケースの総数を示す整数Tを含んでいます。各テストケースは、その後、一列に整数nを用いてn個の整数A1と一行を開始し、A2、...、。
1≤T≤2000
2≤n≤105
1≤ai≤105
n>は1000年で、最大20のテストケースがあります。
出力
各テストケースについては、してください出力「`YES`」それはほとんどソートされている場合。それ以外の場合は、出力 "` NO`"(引用符なしの両方)。
サンプル入力
3 3 2 1 7 3 3 2 1 5 3 1 4 1 5
サンプル出力
YES YES NO
コードは以下の通りであります:
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <cstdlib> の#include <アルゴリズム> 使用して 名前空間STDを、 const int型 MAXN = 1E5 + 5 。 INT [MAXN] B。 int型のn; int型の検索(int型 NUM、int型の低、int型高) { int型ミッド。 一方(低<= 高) { 半ば =(ハイロー+)/ 2 。 もし(NUM> = B [中間]) 低 =ミッド+ 1 ; 他の 高 =中旬- 1 。 } 戻り低いです。 } int型のフィン(INT * A) { int型LEN、POS。 B [ 1 ] = [ 1 ]。 LEN = 1 。 以下のために(int型 I = 2 ; iが<= N; iは++ ) { 場合([i]が> = B [LEN]) { LEN = LEN + 1 。 B [LEN] = [I]。 } 他 { POS =検索([I]、1 、LEN)。 B [posが] = [I]。 } } もし(LEN> = N - 1 ) を返す 真。 それ以外の 返し はfalse ; } INT T [MAXN]、TT [MAXN]。 INT のmain() { int型CAS。 scanf_s(" %のD "、およびCAS)。 一方、(cas-- ) { (scanf_s 」%のD "、&N) 以下のために(int型 i = 1 ; iが++; iが<= N ) scanf_s(" %dの"、T + I)。 以下のために(int型 i = 1 ; iが<= N; iは++ ) TTを[N + 1 - I] =のT [i]は、 ブールフラグ= フィン(T)。 フラグ | = フィン(TT)。 もし(フラグ) のprintf(" YES \ n " ); 他 のprintf(" NO \ nをしません" ); } }