タイトル説明
これは、長さnの配列を有し、{A1、A2、...、}。m回のクエリでは、最小間隔内の各自然数を求めて何をされていません。
入力形式
最初の行のN、M。
二行番号n。
R、3行目から各質問Lの行を開始します。
出力フォーマット
各問い合わせへの回答を表す数字を並べます。
このようなアプローチは、残業のように答えるだろうと考え始め、私は実際に書くことを期待していませんでした。。。
1の#include <cstdioを> 2の#include <アルゴリズム> 3の#include <math.h>の 4の#include < 文字列・H> 5 使って 名前空間STDを、 6 のconst int型 MAXN = 2E5 + 10 。 7 のint NUM [MAXN]。 8 int型の答えは、ブロック。 9 INT VIS [MAXN]。 10 構造体ノード 11 { 12 のint L、R、ID。 13 int型アンス。 14 } [MAXN] ANS。 15 ブールCMP(ノードX、ノードY) 16 { 17。 IF(XL /ブロック= YL /!ブロック) 18である 戻り XL < YLを、 19 IF(XL /ブロック&1) // 波形ソーティングを使用してさらに最適化することができる 20は、 リターン XR < ; YR 21が リターン XR> YR。 22は } 23が BOOL CMP(ノードX、Yノード) 24 { 25 リターン x.id < y.id; 26である } 27 ボイド削除(int型POS) 28 { 29 VIS [NUM [POS] - 。 30 であれば(VIS [NUM [POS] && NUM [POS] <!答え){ 31 答え= NUM [POS]。 32 } 33 } 34 空隙追加(int型POS) 35 { 36 VIS [NUM [POS] ++ ; 37 であれば(VIS [NUM [posが]] == 1 &&答え== NUM [POS]){ 38 のint TMP =回答+ 1 。 39 一方、(1 ){ 40 であれば(!VIS [TMP]){ 41 答え= TMP。 42 リターン; 43 } 44 TMP ++ 。 45 } 46 } 47 } 48 のint main()の 49 { 50 int型N、M。 51 のscanf(" %D%dの"、&N、&M)。 52 ブロック= SQRT(N)。 53 のために(int型 i = 1 ; iが<= N; iが++)のscanf(" %dの"、およびNUM [I])。 54 のためには、(int型、I = 1 ; I <= M、I ++){ 55 のscanf(" %dの%のD "、&ANS [I] .L、&[I] ANS .R)。 56の ANS [I] .ID = I。 57 } 58 ソート(ANS + 1、ANS + 1 + M、CMP)。 59 INT左= 1、右= 0 。 60 のためには、(int型 = Iを1 ; iが<= M; iは++ ){ 61 ながら(ANS [I] .L>左)(左++削除します)。 62 一方(ANS [I] .L <左)を追加( - 左)。 63 しばらく(ANS [I] .R>右)を追加(++ 右)。 64 一方(ANS [I] .R <右)を削除し(right-- )。 65の ANS [i]を.Ans = 答えます。 66 } 67 ソート(ANS + 1、ANS + 1 + M、CMP)。 68 のために(int型 I = 1 ; I <= M Iは++ ) 69 のprintf(" %d個の\ n " 、ANS [I] .Ans)。 70 リターン 0 ; 71 }