Moのチームp4137

タイトル説明

これは、長さ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 }

 

おすすめ

転載: www.cnblogs.com/pangbi/p/11628134.html