ZOJ-3940 E Modulo Query Ideas para el 13 ° Concurso de la provincia de Zhejiang

Título

Dé una matriz a, deje que el número X en el rango de 0 a M tome el módulo ai por turno, pregunte q veces, cuántas X hay, y el resultado del cálculo es equivalente a preguntar yi.

https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370044

análisis

Drena el blog de los grandes

Si [0, M] (1) [0, M] (1)[ 0 ,M ] ( 1 ) representa un intervalo de 1 a M, y cada elemento i tiene solo un elemento mapeado a sí mismo (por ejemplo, 5% 100 == 5). Entonces, la operación de módulo se puede expresar como tal.

{[0, M] (1)% A i} → {[0, A i] (M / A i)} + {[0, M% A i] (1)} \ {[0, M] ( 1) \% A_i \} \ rightarrow \ {[0, A_i] (M / A_i) \} + \ {[0, M \% A_i] (1) \} { [ 0 ,M ] ( 1 ) % Ayo}{ [ 0 ,UNAyo] ( M / Ayo) }+{ [ 0 ,M % Ayo] ( 1 ) }

De esta forma, cada intervalo se puede contar por separado.

Pasos de implementación específicos:

  • Utilice la tecla del mapa para marcar el límite derecho y el val para marcar el número.
  • Estado inicial, inserte un <m, 1> en el mapa
  • Cada vez que obtenga una ai, recorra y consulte todos los elementos con la tecla> = ai, y procese la división de estos intervalos.

Aquí necesitamos usar el iterador de mapa y la operación de eliminación.
Se reclama el iterador del mapa, lo que significa que si elimina el elemento al que apunta
este iterador , el iterador dejará de ser válido.
Si no está familiarizado, puede escribirlo estúpidamente:
auto et = it;
it = next(it);
mp.erase(er);
esta pregunta es en realidad un poco especial. El elemento modificado debe estar delante de la posición actual, ya
veces habrá problemas impredecibles cuando se inserte en la parte posterior.

  • Recorre el mapa hacia atrás, similar a hacer una suma de sufijo. (No es necesario, pero creo que la complejidad de la consulta será un poco mayor)
  • Para cada consulta, siempre que la clave sea mayor o igual que qi, significa el número de elementos asignados a qi.

La complejidad de la conjetura perceptual no será muy alta.
La consideración racional debe ser O (N log 2 N) O (Nlog ^ 2N)O ( N l o g2 N). (Un registro proviene de dos puntos, un registro proviene del mapa)

Código singleton

map<int, ll> tree;

void solve(int kaseId = -1) {
    
    
    int n, m, q;
    cin >> n >> m;
    tree.clear();
    tree.emplace(m, 1);

    for (int i = 1, ai; i <= n; ++i) {
    
    
        cin >> ai; // ai >= 1
        for (auto it = tree.lower_bound(ai); it != tree.end();) {
    
    
            int key = it->first;
            ll val = it->second;

            tree.erase(it++);
            tree[ai - 1] += val * (key / ai);
            tree[key % ai] += val;
        }
    }

    ll suf = 0;
    for (auto it = tree.rbegin(); it != tree.rend(); ++it) {
    
    
        it->second += suf;
        suf = it->second;
    }

    cin >> q;
    ll ans = 0;
    for (int i = 1, qi; i <= q; ++i) {
    
    
        cin >> qi;
        ans = (ans + tree.lower_bound(qi)->second * i) % MOD;
    }

    cout << ans << endl;
}

Supongo que te gusta

Origin blog.csdn.net/Tighway/article/details/108026418
Recomendado
Clasificación