Codeforcesラウンド#615(DIV。3)。D - MEX最大化

質問表面ます。https://codeforces.com/contest/1294/problem/D

 

効果の件名:

たびに、あなたのリガ値に列の数は、あなたが追加し、任意の回数の値を引くことができます(ただし、唯一のプラスまたはマイナスX X)

そして、最小の数は、この列に属していない尋ねることは何非負の整数であります

あなたが確認する必要があり操作が最小の非負の整数が、列の最大数に属していないようにすることです

たびに、プラス値と再び尋ねます

 

問題解決のアイデア:

簡単には、取得貪欲意志上昇の完全なタイトルを実行した後、すべての出力に答えて、その値は、配列の要素の最大数の範囲内でのみ可能であるにします

私たちは各添加の値はシーケンスの前にあることが可能な限りいくつかの操作を実行した後に終了してみましょうことができるように大きくなることができ、ヘルプの答えに可能な限り、値には現れていません

対象のサンプルについて、考えるべきではないアイデアのヒントによると、以下の手順では、上記の考えに基づいて取得することができます -

Q = 7、X = 3

シーケンス[0]、0を追加し、答えは1

1、配列[0、1]を添加し、答えは2

配列[0、1]、2を添加し、答えは3

2が存在していたので、そのシーケンスは[0,1,2,5]であるので欲が、5である2がはるか前方にできるだけ見えない数になってみましょう、2を追加し、答えは3です

0があまりにもありますので0、そう欲が3である0がはるか前方にできるだけ見えない数になってみましょう、追加、シーケンス[0,1,2,3,5]は、答えは4です

0追加、答えを、0は数字の0になるようにする、あまりにも貪欲があるので遠く前方に表示されず、3があったので、それは、シーケンス6である[3、5] 4

[0,1,2,3,4,5,6] 10、10は見られなかった加えて、数ははるか前方になるようには見えない、4利用可能になることができ、シーケンス、答えは7

上記操作の後、ルールを見つけることができ

ミックスに新しいアドオンは、dの値は、彼らがどのように変化するかように、どのように関係なく(+ X / -X)、D%xの値は変わりません

それは、メモリアレイの異なるミニDの%xデジタルこのタイプは、現時点では表示されないと考えられる最小値を有していました

ミニを取る、値dを混合する後続の各追加[D%x]は、次の番号が見られないことができるように追加現在のシーケンスの数は、その後、ミニ[D%X] + Xせよう

ミニ[t]は> qは、あまりにも多くの数のこのタイプを示す、プラスの答えに寄与存在しません、我々は考えることができない場合

変数としてのみ上昇に対する答えが、それはあなたが増加に試すことができたときに使用するように各状態のままので、その後、答えを聞かせて

(ARR [年])年++中。

彼が増加することができるように(もし順番に配列arrの裁判官の存在の数)

1  / * 
2  書かによりStelaYuri
 3。 2020年1月22日に
 4。 * / 
5。は、の#include <ビット/ STDC ++ H.>
 6。 使用した 名前空間STD;
 7  BOOL ARR [ 400050、中国 ]; //は、直列の電流iに存在するか否かを判定する
8  INTミニ[ 400050、中国 ]; // D%X種下配列ARRの最小数に表示されていない
9。 ボイド){(解決
 10      INT Q、X、D、T、I、ANS = 0 ;
 11      CIN> > Q >> X;
 12である     ため(私は= 0 ; I <X; I ++ 13は         ミニ[i]は= 私;
14      のために(私は= 0 ; I <Q、I ++ ){
 15          CIN >> D。
16          T = D%X。
17          であれば(ミニ[T] <= Q){
 18              ARR [ミニ[T] = 19              一方(ARR [ANS])
 20の                  ANS ++ 21の              ミニ[T] + = X。
22          }
 23          COUT << ANS << ' \ n ' 24      }
 25  }
 26  INTメイン(){
 27の      IOS :: sync_with_stdio(0 )。
28      cin.tie(0); cout.tie(0 )。
29      )(解きます。
30      
31      戻り 0 ;
32 }

 

コードまたは簡略化、同じ意味の下では、限り、今回のようにすることができ、複数のモジュロ演算

1  / * 
2  書かによりStelaYuri
 3  2020年1月22日に
 4  * / 
5の#include <ビット/ STDC ++ H>
 6  使って 名前空間STDを、
7  int型 ARR [ 400050 ]。
8  ボイド解く(){
 9      int型 Q、X、D、T、I、ANS = 0 10      CIN >> Q >> X。
11      一方(q-- ){
 12          CIN >> D。
13          ARR [D%X] ++ ;
14          一方(ARR [ANS%X]){
 15             ARR [ANS%X] - 16の              ANS ++ ;
17          }
 18          COUT << ANS << ' \ n ' 19      }
 20  }
 21  INT メイン(){
 22の      IOS :: sync_with_stdio(0 )。
23      cin.tie(0); cout.tie(0 )。
24      )(解きます。
25      
26      戻り 0 ;
27 }

おすすめ

転載: www.cnblogs.com/stelayuri/p/12230033.html