Tokitsukaze y la Tabla Hash

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;
}
Publicado 54 artículos originales · ganado elogios 0 · Vistas 1218

Supongo que te gusta

Origin blog.csdn.net/weixin_44144278/article/details/100086725
Recomendado
Clasificación