Dia Nacional de Niuke dia 8 Paisagem melhorada (dois pontos)

Link: https://ac.nowcoder.com/acm/contest/7865/F
Fonte: Niuke

题目 描述
Louis L Le Roi-Univers ordenou melhorar a paisagem que se avista do palácio real. Sua Majestade prefere ver uma montanha alta.
O gerente paisagístico chefe vai erguer uma montanha para Louis. Ele representa uma paisagem como uma imagem plana em uma grade de quadrados unitários. Algumas das praças já estão cheias de pedra, enquanto outras estão vazias. Isso simplifica muito o design. Os quadrados das unidades são pequenos o suficiente, e a paisagem parece ser suave do palácio real.
O gerente paisagístico chefe tem uma planta da paisagem - as alturas de todas as colunas cheias de rochas para cada unidade de largura. Ele vai adicionar no máximo n unidades quadradas de pedras no topo da paisagem existente para fazer uma montanha com o pico mais alto possível. Infelizmente, as pilhas de pedras são bastante instáveis. Um quadrado de pedras unitário pode ser colocado apenas exatamente em cima do outro quadrado de pedras ou rocha preenchido, além disso, os quadrados imediatamente à esquerda e à direita dele já devem estar preenchidos.

Sua tarefa é ajudar o Gerente de Paisagismo Chefe a determinar a altura máxima da montanha mais alta que ele pode construir.
输入 描述:
A primeira linha do arquivo de entrada contém dois inteiros w - a largura da paisagem existente en - o número máximo de quadrados de pedras para adicionar (1 ≤ w ≤ 100 000, 0 ≤ n ≤ 1018).
Cada uma das seguintes linhas w contém um único inteiro hi - a altura da coluna da paisagem existente (1 ≤ hi ≤ 109).
输出 描述:
O arquivo de saída deve conter o único inteiro - a altura máxima possível da paisagem após no máximo n quadrados unitários de pedras são adicionadas de forma estável.示例
1
输入
复制
8 4
3
4
2
1
3
3
2
4

Cópia de saída
5
Exemplo 2 Cópia de
entrada 3 100 3 3 3 Cópia de saída 4







Pergunta:
Colocar uma grade requer que haja uma grade na parte inferior esquerda e inferior direita.
Você pode adicionar no máximo n grades para encontrar a altura máxima.

Idéia: Quanto
maior a altura, mais grades precisam ser colocadas, então você pode pensar em cortar nessa altura.

Para a posição iii , assumindo que a altura inicial éh [i] h [i]h [ i ] , a altura a ser alterada émeio a meiom i d , precisamos descobrir quantos quadrados a mais são necessários. Neste momento eiiA altura da grade onde i está x longe um do outro deve ser maior ou igual amid - x mid-xm eu d-x , caso contrário, não pode ser preenchido. Contanto que você encontre a primeira posição à esquerda e à direita que atenda a essa condição, você pode preenchê-la. Não pode ser preenchido se não for encontrado.

Então, para encontrar o primeiro jj da posição atual para a direitaA posição onde j satisfazh [j] ≥ mid- (j - i) h [j] ≥ mid- (ji)h [ j ]m eu d-( j-I ) A posição está definida , a esquerda para encontrar a primeira posiçãokkk满足h [k] ≥ meio - (i - k) h [k] ≥ meio- (ik)h [ k ]m eu d-( eu-k ) , em seguida, preencha[j, k] [j, k][ j ,k ] parte. Use o prefixo e calcule quanto preencher na parte de preenchimento.

Cada número corresponde a a h [i] - ih [i] -ih [ i ]-i (estágio de linha 1) dadoh [i] + ih [i] + ih [ i ]+i (árvore de segmento de linha 2), então este processo pode ser mantido pela árvore de segmento de linha.

Se iii Esta posição deve ser preenchida atémeados da metadem i d , você pode encontrar o primeiro valor à direita na árvore de segmento de linha 1 é maior quemid - i mid-im eu d-Para o ponto de i , o primeiro valor da coordenada a ser encontrada na árvore de segmento de linha 2 é maior do quemid + i mid + im eu d+i é ponto. Você pode saber quais partes preencher.

Esta parte também pode ser pré-processada diretamente para manter L [i] L [i]L [ i ] significaiiEu preenchi nomeiom i d , correspondendo ao primeiro à esquerda que satisfazh [j] ≥ mid - (i - j) h [j] ≥mid- (ij)h [ j ]m eu d-( eu-j ) localização. OR [i] R [i]R [ i ] preenchido emmeados de meadosm i d , correspondendo ao primeiro à direita que satisfazh [j] ≥ mid - (j - i) h [j] ≥mid- (ji)h [ j ]m eu d-( j-i ) posição

#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;
}

Acho que você gosta

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