トピック::
リンク: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 }