Día Nacional de Niuke día8 Paisaje Mejorado (dos puntos)

Enlace: https://ac.nowcoder.com/acm/contest/7865/F
Fuente: Niuke

题目 描述
Louis L Le Roi-Univers ha ordenado mejorar el paisaje que se ve desde el palacio real. Su Majestad prefiere ver una montaña alta.
El Gerente Jefe de Paisajismo va a levantar una montaña para Louis. Representa un paisaje como una imagen plana en una cuadrícula de unidades cuadradas. Algunas de las plazas ya están llenas de rocas, mientras que otras están vacías. Esto simplifica enormemente el diseño. Los cuadrados unitarios son lo suficientemente pequeños y el paisaje parece ser suave desde el palacio real.
El Gerente Jefe de Paisajismo tiene un plano del paisaje: las alturas de todas las columnas rellenas de roca para cada unidad de ancho. Va a agregar como máximo n unidades cuadradas de piedras sobre el paisaje existente para hacer una montaña con el pico más alto posible. Desafortunadamente, las pilas de piedras son bastante inestables. Un cuadrado unitario de piedras solo puede colocarse exactamente encima del otro cuadrado lleno de piedras o roca; además, los cuadrados que se encuentran inmediatamente en la parte inferior izquierda y en la parte inferior derecha ya deben estar llenos.

Su tarea es ayudar al Gerente de Paisajismo en Jefe a determinar la altura máxima de la montaña más alta que puede construir.
输入 描述:
La primera línea del archivo de entrada contiene dos enteros w - el ancho del paisaje existente yn - el número máximo de cuadrados de piedras para agregar (1 ≤ w ≤ 100 000, 0 ≤ n ≤ 1018).
Cada una de las siguientes w líneas contiene un único entero hi - la altura de la columna de paisaje existente (1 ≤ hi ≤ 109).
输出 描述:
El archivo de salida debe contener un único entero - la máxima altura posible del paisaje después de n cuadrados unitarios como máximo de piedras se añaden de forma estable.
示例 1
输入
复制
8 4
3
4
2
1
3
3
2
4
Salida
Copia
5
Ejemplo 2
de entrada
Copia
3 100
3
3
3
de salida
Copia
4

Pregunta:
Poner una cuadrícula requiere que haya una cuadrícula en la parte inferior izquierda y en la parte inferior derecha.
Puede agregar como máximo n cuadrículas para encontrar la altura máxima.

Idea: cuanto
mayor sea la altura, más rejillas se deben colocar, por lo que puede pensar en cortar esta altura en cubitos.

Para la posición iii , asumiendo que la altura inicial esh [i] h [i]h [ i ] , la altura a cambiar esmedia mediam i d , tenemos que averiguar cuántos cuadrados más se necesitan. En este momento yiiLa altura de la cuadrícula donde i está a x debe ser mayor o igual quemid - x mid-xm i d-x , de lo contrario no se puede llenar. Siempre que encuentre la primera posición a la izquierda y a la derecha que cumpla con esta condición, puede llenarla. No se puede completar si no se encuentra.

Entonces, para encontrar el primer jj de la posición actual a la derechaLa posición donde j satisfaceh [j] ≥ mid - (j - i) h [j] ≥ mid- (ji)h [ j ]m i d-( j-I ) La posición se fija , a la izquierda para encontrar la primera posiciónkkk满足h [k] ≥ medio - (i - k) h [k] ≥ medio- (ik)h [ k ]m i d-( yo-k ) , luego completa[j, k] [j, k][ j ,k ] parte. Use el prefijo y calcule cuánto llenar en la parte de relleno.

Cada número corresponde a una h [i] - ih [i] -ih [ i ]-i (línea etapa 1) dadoh [i] + ih [i] + ih [ i ]+i (árbol de segmento de línea 2), este proceso puede ser mantenido por el árbol de segmento de línea.

Si iii Esta posición debe llenarse hasta lamitadm i d , puede encontrar el primer valor a la derecha en el árbol de segmento de línea 1 es mayor quemid - i mid-im i d-Para el punto de i , encuentre el primer valor de la coordenada en el árbol del segmento de línea 2 mayor quemid + i mid + im i d+i 's punto. Puede saber qué partes llenar.

Esta parte también se puede preprocesar directamente para mantener L [i] L [i]L [ i ] significaiii llena enmediados mediadosm i d , correspondiente al primero de la izquierda que satisfaceh [j] ≥ mid - (i - j) h [j] ≥mid- (ij)h [ j ]m i d-( yo-j ) ubicación. ElR [i] R [i]R [ i ] se completó enmid midm i d , correspondiente al primero de la derecha que satisfaceh [j] ≥ mid - (j - i) h [j] ≥mid- (ji)h [ j ]m i d-( j-i ) posición

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <map>
#include <queue>
#include <cmath>
using namespace std;

typedef long long ll;
const int maxn = 1e5 + 7;

int n;
ll m,sum[maxn];
int a[maxn];
int L[maxn],R[maxn]; //这个点达到h高度所需改变的第一个左边下标位置,第一个右边下标位置

bool check(int mid) {
    
     //期望高度
    for(int i = 1;i <= n + 1;i++) {
    
    
        L[i] = 0;
        R[i] = n + 1;
    }
    for(int i = 1;i <= n;i++) {
    
    
        if(i + mid - a[i] <= n && i + mid - a[i] >= i) {
    
    
            L[i + mid - a[i]] = i;
        }
    }
    for(int i = 1;i <= n;i++) {
    
    
        if(i - mid + a[i] >= 1 && i - mid + a[i] <= i) {
    
    
            R[i - mid + a[i]] = min(R[i - mid + a[i]],i);
        }
    }
    for(int i = 1;i <= n;i++) L[i] = max(L[i],L[i - 1]);
    for(int i = n;i >= 1;i--) R[i] = min(R[i],R[i + 1]);
    
    for(int i = 1;i <= n;i++) {
    
    
        if(L[i] == 0 || R[i] == n + 1) continue;
        ll res = 1ll * (mid + mid - (i - L[i])) * (i - L[i] + 1) / 2;
        res += 1ll * (mid - 1 + mid - 1 - (R[i] - i - 1)) * (R[i] - i - 1 + 1) / 2;
        res -= sum[R[i]] - sum[L[i] - 1];
        if(res <= m) return true;
    }
    return false;
}

int main() {
    
    
//    freopen("landscape.in","r",stdin);
//    freopen("landscape.out","w",stdout);
    scanf("%d%lld",&n,&m);
    int l = 0,r = 2e9;
    for(int i = 1;i <= n;i++) {
    
    
        scanf("%d",&a[i]);
        l = max(l,a[i]);
        sum[i] = sum[i - 1] + a[i];
    }
    
    int ans = l;
    while(l <= r) {
    
    
        int mid = (l + r) >> 1;
        if(check(mid)) {
    
    
            ans = mid;
            l = mid + 1;
        } else {
    
    
            r = mid - 1;
        }
    }
    
    printf("%d\n",ans);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/tomjobs/article/details/108999200
Recomendado
Clasificación