牛オフ練習一致50 Bのtokitsukazeとハッシュテーブル

トピック::
リンク:https://ac.nowcoder.com/acm/contest/1080/B

                 そこtokitsukaze数nが、順序はハッシュテーブルにそれらを接続する必要があり、ハッシュテーブル位置は、0からn-1です。

                 挿入ルールがある:
                 ハッシュテーブルの始まりは空です。
                 Xの数、ハッシュテーブルのため、IF(mod nをx)の位置は空であり、x(mod nをx)の位置に置きます。それは(mod nをX)から挿入の空の位置の開始を見つけるために右に、空でない場合。最大のn-1が空でない場合、最初の空の位置が挿入されている見つけるために右を続行位置0から始めます。

                 ハッシュテーブルので、n個の空間の合計は、数nは、各番号を挿入することができるように、挿入する必要があります。

                tokitsukaze後今どの番号のそれぞれに対応する各位置において、この数nが順次挿入ハッシュテーブル、ハッシュテーブルを知りたいです。

     入力::

              最初の行は、正の整数n(1≤n≤10^ 6)を含みます。
              二行目は、非負整数nはX(^ 90≤x≤10)を備え、これらの番号が順次右ハッシュテーブルに左から挿入されています。

    出力::

      出力ライン数Nは、番号iに対応するハッシュテーブルのi番目の位置です。(0≤i≤n-1)

    サンプル1 ::

      4 
      1 2 6 5

    サンプル2 ::

      4 
      3 0 7 11 

の解析::
普通の思考が再び行かなければならないがTLEを見つけました。私たちは、コンテナの良い考えを設定半分、約書くために最適化することができ、
最初の前処理0〜N-1がセットに挿入され、返し端()は()s.begin必要に変更されたとき;すばやく最初の空の位置を見つけ、それを削除できる機能をLOWER_BOUND使用してデータ入力処理を行うため、および削除;
本明細書中に戻さ反復子位置に配置されている値は、アレイを格納するために開始することができる表し、
詳細は参照::コード
1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3 typedefの長い 長いLL。
4  CONST = MOD LL 998244353 5  のconst  int型 MAXN = 1E6 + 10 6  int型MA [MAXN]。
7  セット < int型 > S;
8  のint main()の
 9  {
 10      s.clear()。
11      INT N。
12      のscanf(" %d個"、&N)
13     以下のためにint型 i = 0 ; iがn <I ++は{)
 14          s.insert(i)を、
15      }
 16      のためのint型 i = 1 ; iがn = <; iは++ ){
 17          、INT X、K。
18          のscanf(" %dの"、およびX)
19          INTのANS =のX。
20          X%= N。
21          セット < 整数 > ::イテレータit。
22          は= s.lower_bound(X)を、
23          もし(それ!= s.end()){
24              K = * こと。
25              s.erase(IT)。
26          }
 27          {
 28は、              それが= ()s.beginします。
29              K = * こと。
30              s.erase(IT)。
31          }
 32          MA [K] = ANS。
33      }
 34      のためのint型 i = 0 ; iがn <; iは++ ){
 35          であれば(I == 0 ){
 36              のprintf(" %dの" 、MA [I])。
37         }
 38          {
 39              のprintf(" %dの" 、MA [I])。
40          }
 41      }
 42      リターン 0 43 }

           私は、この問題だけでなく、ソリューションを持っています

           同様の互いに素セット(も-_-ことを言うことはできません)

          分析::

          まず、事前記録が0〜N-1であり、次いで父親を見つけることによって、空の位置を見つけます。

        

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3 typedefの長い 長いLL。
4  CONST = MOD LL 998244353 5  のconst  int型 MAXN = 1E6 + 10 6  int型MA [MAXN]。
7  INT [MAXN] F。
8  INT getfather(INT X)
 9  {
 10      リターン?[x]はx F X ==:[X] = F getfather([X] F)。
11  }
 12  のint main()の
 13  {
 14     int型のn;
15      のscanf(" %d個"、&N)
16      のためにint型 i = 0 ; iがN <; Iは++ ){
 17          F [I] = I。
18      }
 19      のためのint型 i = 1 ; iがn = <; iは++ ){
 20          、INT X、Y。
21          のscanf(" %dの"、およびX)
22          、Y =のX。
23          X = getfather(X%でのN)。
24          MA [X] = Y。
25          F [X] =(Xの+ 1)%N-、最初の空の位置の後//占有位置やポイントを変更
 26である     }
 27      のためにint型 I = 0、I <N - 、Iは++ ){
 28          IF(I == 0 ){
 29              のprintf(" %のD " 、ミリアンペア[I]);
 30          }
 31が         {
 32              のprintf(" %のD " 、ミリアンペア[I]);
 33である         }
 34はである     }
 35      リターン 0 ;
 36 }

 

おすすめ

転載: www.cnblogs.com/sj-gank/p/11407719.html