51 Intervalo n. ° 1686 Kth (dicotomía, selección de regla, discretización)

El enlace del título
  menciona primero que la primera oración es muy importante. Es importante definir el valor de un intervalo como el número de ocurrencias de su modo. El valor del intervalo es el número de veces en lugar del modo. Esta es una pregunta de respuesta de decisión binaria clásica. Si lo piensa de frente, no es fácil de hacer. Realmente se siente imposible comenzar, pero puede considerar la respuesta de decisión. Después de todo, la decisión es más simple que la solución.
  Como \ (n \ leq 1e5 \) , el rango de la respuesta es un número entre \ (1 \) y \ (n \) . Si usa una dicotomía, el tiempo empleado es considerable. Pero hay una nueva pregunta: ¿cómo determinar si cada solución es correcta? Si se enumeran todos los intervalos, la complejidad del tiempo debe ser al menos \ (n ^ 2 \) , y seguirá siendo TLE. Para un intervalo, si el número más grande en el intervalo \ (k \) es una solución que queremos determinar, si el intervalo se extiende hacia la izquierda y hacia la derecha, entonces el intervalo obtenido \ (k \) debe ser mayor o igual que entender nuestra determinación, entonces, si la enumeración más a la izquierda punto de cada sección, sin duda hay un punto justo hasta el punto final izquierdo do el punto de inicio y final del intervalo de mayor que o igual derecho de \ (k \) grande sin duda Mayor que la solución determinada. Por lo tanto, al enumerar los puntos finales izquierdos y encontrar el valor mínimo de cada punto final derecho que cumpla con las condiciones, podemos calcular el número de intervalos en todos los intervalos mayores o iguales a la solución que se determinará dentro del tiempo de \ (O (n) \) , Siempre que el número de intervalos sea igual o mayor que (mayor que es un caso especial, como que el número de modos en todos los intervalos sea el mismo es mayor que), entonces puede haber una solución.
  Pero hay otro problema, que es calcular el modo del intervalo. Aquí es fácil pensar en abrir una matriz para contar el número de ocurrencias de cada número, y luego compararlo con la solución determinada. Sin embargo, los números en la pregunta son grandes, y no es realista calcular directamente la matriz. Por lo tanto, puede considerar usar el contenedor \ (mapa \) para calcular (pero puede estar atascado), o puede usar la discretización (porque solo nos importa la relación de tamaño entre cada número, no su valor), la complejidad del tiempo Será más pequeño En resumen, la complejidad de tiempo total de todas las operaciones se suma a \ (O (nlogn) \) .

const int maxn = 1e5+10;
int n, k, arr[maxn], tmp[maxn], cnt[maxn];
bool checker(int num) {
    ll sum = 0;
    int l = 0;
    zero(cnt);
    for (int i = 0; i<n; ++i) {
        ++cnt[arr[i]];
        while(cnt[arr[i]]>=num) {
            sum += n-i;
            --cnt[arr[l]];
            ++l;
        }
    }
    return sum >= k;
}
int main(void) {
    scanf("%d%d", &n, &k);
    for (int i = 0; i<n; ++i) {
        scanf("%d", &arr[i]);
        tmp[i] = arr[i];
    }
    sort(tmp, tmp+n);
    int p = unique(tmp, tmp+n)-tmp;
    for (int i = 0; i<n; ++i) 
        arr[i] = lower_bound(tmp, tmp+p, arr[i])-tmp;
    int l = 1, r = n;
    while(l<=r) {
        int mid = (l+r)>>1;
        if (checker(mid)) l = mid+1;
        else  r = mid-1;
    }
    printf("%d\n", r);
    return 0;   
}

Supongo que te gusta

Origin www.cnblogs.com/shuitiangong/p/12718491.html
Recomendado
Clasificación