Enlace: https: //ac.nowcoder.com/acm/contest/1080/B
Fuente: Red de Ganado-off
Hay Tokitsukaze número n, la necesidad con el fin de conectarlos a una tabla hash, la posición de la tabla hash es 0 a n-1.
Insertar regla es:
el comienzo de la tabla hash está vacía.
Para un número de x, la tabla hash, si la posición (x mod n) está vacío, poner en x posición (x mod n). Si no está vacío, a partir de (x mod n) a la derecha para encontrar el inicio de una posición vacía de la inserción. Si hasta n-1 no está vacío, comenzar desde la posición 0 continuar hasta encontrar la primera posición vacía se inserta.
Dado que la tabla hash un total de espacio de n, el número n necesidades para ser insertados, de modo que cada número se puede insertar.
Después de Tokitsukaze ahora querer saber este número n tabla hash insertado secuencialmente, la tabla hash en cada posición correspondiente a cada uno de los cuales el número.
Descripción Entrada:
La primera línea contiene un número entero positivo n (1≤n≤10 ^ 6).
La segunda línea se compone de un número entero no negativo n x (0≤x≤10 ^ 9), estos números se insertan secuencialmente de izquierda a derecha tabla hash.
Descripción Salida:
salida un número de línea n, denota el i-ésimo posición en la tabla hash correspondiente al número i. (0≤i≤n-1)
Ejemplo 1
de entrada
Copiar
. 4
. 1 2. 6. 5
de salida
Copiar
5126
Descripción
Al insertar 1, 1 mod 4 = 1, está vacío, una posición insertada.
Cuando el inserto 2, 2 mod 4 = 2, está vacío, se inserta en la posición 2.
La inserción 6, 6 mod 4 = 2, no está vacío, para encontrar la siguiente ubicación vacía es 3, 3 posición insertada.
Inserción 5, 5 mod 4 = 1, no está vacío, para buscar la siguiente posición libre es 0, la posición de inserción 0.
Ejemplo 2
de entrada
Copia
. 4
. 3. 7 0. 11
de salida
Copiar
07113
Descripción
Cuando se inserta 3, 3 mod 4 = 3, está vacía, se insertó en la posición 3.
Al insertar 0, 0 mod 4 = 0, está vacía en la posición 0 se inserta.
La inserción 7, 7 mod 4 = 3, no está vacío, para encontrar la siguiente ubicación vacía 1, la posición de inserción 1.
Inserto 11, 11 mod 4 = 3, no está vacío, para encontrar la siguiente ubicación vacía es 2, insertado en la posición 2.
Significado de las preguntas: Para un número x, si la posición (x mod n) está vacío, poner en x (x mod n) de posición, si existen elementos de la posición, el uno hacia atrás para ( cuando n no han encontrado que vuelva a la posición inicial 0)
#include <iostream>
#include <set>
using namespace std;
const int N = 1000005;
int res[N];
int main()
{
ios::sync_with_stdio(false);
set<int>s;
int n;
cin >> n;
for(int i=0;i<n;i++)///先用set将每个位置插入
s.insert(i);
for(int i=0;i<n;i++)
{
int x;
cin >> x;
int r=x%n;
auto it=s.lower_bound(r);///二分寻找第一个大于等于x%m的位置
if(it==s.end())如果不存在 则将其放在set的第一个位置
it=s.begin();
res[*it]=x;///记录答案
s.erase(it);///将用过的位置抹去
}
for(int i=0;i<n;i++)
{
cout << res[i] << " ";///输出
}
cout << endl;
return 0;
}
Escribía este tiempo debe esperar encontrar esa posición media, pero no creo que si se va a empezar de cero cómo proceder.
Disjuntos-set Niubi ...
#include <iostream>
using namespace std;
const int N = 1e6+5;
int fa[N],res[N];
int findx(int x)
{
return fa[x]==x?fa[x]:fa[x]=findx(fa[x]);
}
int main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
for(int i=0;i<n;i++)///初始化
fa[i]=i;
for(int i=0;i<n;i++)
{
int x;
cin >> x;
int pos=findx(x%n);///寻找
res[pos]=x;
fa[pos]=(pos+1)%n///更新使用过的位置使其后移一位
}
for(int i=0;i<n;i++)
cout << res[i] << " ";
cout << endl;
return 0;
}