Solución del problema de la lombriz T

Lombriz de tierra

En esta pregunta, utilizaremos el símbolo \ ([c] \) para indicar el redondeo a c, por ejemplo: \ ([3.0] = [3.1] = [3.9] = 3 \) . ¡La lombriz de tierra se ha convertido recientemente en un desastre! La pulga en el país de las pulgas de al lado no podía tomar las lombrices de tierra. El Rey Grillo tuvo que pedirle al espadachín que las ayudara a destruir la lombriz de tierra. Ahora hay \ (n \) lombrices de tierra en el país de cricket ( \ (n \) es un número entero positivo). Cada lombriz de tierra tiene una longitud, establecemos la longitud de la primera lombriz de tierra \ (i \) en \ (a_i (i = 1,2, ..., n) \) y nos aseguramos de que todas las longitudes sean enteros no negativos (es decir: Puede haber lombrices de tierra de longitud \ (0 \) ). Cada segundo, el espadachín encontrará el más largo entre todas las lombrices de tierra (elija uno si hay muchos) y córtelo por la mitad. La posición de la mano de cuchillo mágico para cortar la lombriz de tierra está determinada por la constante \ (p \) ( un número racional que satisface \ (0 <p <1 \)) . Si la longitud de esta lombriz de tierra es \ (x \) , la mano de cuchillo mágico será
Cortar en dos lombrices de tierra de longitud \ ([px] \) y \ (x- [px] \) . En particular, si uno de estos dos números es igual a 0, la lombriz de tierra con una longitud de 0 también será retenida. Además, a excepción de las dos nuevas lombrices de tierra que se acaban de crear, la longitud de las lombrices de tierra restantes aumentará en \ (q \) (una constante entera no negativa). King Cricket sabía que esta no era una solución a largo plazo, porque las lombrices de tierra no solo crecerían más y más, sino que también crecerían más. King Cricket decidió recurrir a una figura misteriosa con gran poder, pero el rescate necesitaba\ (m \) segundos pueden venir ... ( \ (m \) es un número entero no negativo) King Cricket quiere saber la situación en estos m segundos. En concreto, lo que quería saber :? \ (M \) en cuestión de segundos, cada segundo es la longitud de las lombrices de tierra de corte antes de ser cortado (ida \ (m \) ? Número) \ (m \) después de la segunda, todas las lombrices de tierra La longitud (hay \ (n + m \) número). ¡King Cricket ciertamente sabe
qué hacer! Pero él quiere ponerte a prueba ...

Entrada

La primera línea contiene seis enteros \ (n, m, q, u, v, t \) , donde: \ (n, m, q \) para ver el significado, vea la descripción del problema;
\ (u, v, t \) todos Es un entero positivo; necesita calcular \ (p = u / v \) (garantía \ (0 <u <v \) ) \ (t \) es el parámetro de salida, y su significado se explicará en el formato de salida.
La segunda línea contiene n enteros no negativos, que son \ (a_i, a_2, ..., a_n \) , que es la longitud de la lombriz de tierra al principio \ (n \) .
Entre dos números adyacentes en la misma línea, solo use un espacio para separarse.
Garantía \ (1 <= n <= 10 ^ 5, 0 <m <7 * 10 ^ 6, 0 <u <v <10 ​​^ 9, 0 <= q <= 200, 1 <t <71, 0 <ai <10 ^ 8 \) .

Salida

La primera línea genera \ ([m / t] \) enteros, en orden cronológico, los primeros \ (t \) segundos, los primeros \ (2t \) segundos, los primeros \ (3t \) segundos ... La lombriz se corta (Antes de ser cortado) la longitud.
La segunda línea emite \ ([(n + m) / t] \) enteros, y la longitud de la lombriz de tierra después de m segundos se emite; es necesario
generar la clasificación \ (t \) y luego \ (2t \) , La longitud de la sección \ (3t \) ......
Entre dos números adyacentes en la misma línea, solo use un espacio para separarse. Incluso si no hay un número para generar una determinada línea, debe generar una línea en blanco.
Lea la muestra para comprender mejor este formato.

Entrada de muestra

3 7 1 1 3 1
3 3 2

Salida de muestra

3 4 4 4 5 5 6
6 6 6 5 5 4 4 3 2 2

Solución

Los hechos han demostrado que es muy importante encontrar un código que pueda resolver el problema de CA.
% Solución del problema de YouXam

Ideas para resolver problemas

A propiedades tema ocultos: monotonicidad
es primero cortada en las lombrices de tierra de lombrices de tierra después de una cierta proporción de las lombrices de lombrices longitud de corte en
este debe entenderse que
el supuesto de que dos gusanos son \ (A, B \) , en el que \ (a> b \) . Luego se corta en \ (a_1, a_2 \) . Después de \ (t \) segundos, \ (b \) se corta en \ (b_1, b_2 \) . En este momento , la longitud de \ (a_1, a_2 \) es \ (l_ {a_1} + t = p * l_ {a} + t, l_ {a_2} + t = (1-p) * l_a + t \) . y \ (b_1, b_2 \) longitud pero para \ (P * (+ T L_B), (. 1-P) * (+ T I_B) \) , es fácil ver \ (l_ {a_1}> l_ {b_1} , l_ {a_2}> l_ {b_2} \) .
Por lo tanto, no tiene que usar la cola de prioridad en STL para usarla. Es incorrecto usar
dos colas ordinarias para los dos segmentos que se cortan cada vez. Esta cola es naturalmente monótona. Apagado

Código

#include <cstdio>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
const long long M = 0x3f3f3f3f3f3f3f3f;
int n, m, q, u, v, t, a[100005], cnt = 1, s = 0, f;
queue<int> q1, q2;
int main() {
    scanf("%d%d%d%d%d%d", &n, &m, &q, &u, &v, &t);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    sort(a+1, a+n+1, greater<int>());//greater<int>()用到库<set>
    for(int i = 1; i <= m; i++) {
        long long d = -M;
        if (cnt <= n && d < a[cnt])
            d = (long long)a[cnt], f = 0;
        if (q1.size() && d < q1.front())
            d = (long long)q1.front(), f = 1;
        if (q2.size() && d < q2.front())
            d = (long long)q2.front(), f = 2;
        if (f == 1) q1.pop();
        else if (f == 2) q2.pop();
        else cnt++;
        d += s;
        q1.push(d * u / v - s - q);
        q2.push(d - d * u / v - s - q);
        s += q;
        if (i % t == 0) printf("%lld ", d);
    }
    puts("");
    for(int i = 1; i <= m + n; i++) {
        long long d = -M;
        if (cnt <= n && d < a[cnt])
            d = (long long)a[cnt], f = 0;
        if (q1.size() && d < q1.front())
            d = (long long)q1.front(), f = 1;
        if (q2.size() && d < q2.front())
            d = (long long)q2.front(), f = 2;
        if (f == 1) q1.pop();
        else if (f == 2) q2.pop();
        else cnt++;
        if (i % t == 0) printf("%lld ", d + s);
    }
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/Z8875/p/12721123.html
Recomendado
Clasificación