La vaca más alta (la vaca más alta) Acwing101-prefijo suma, diferencia

Vaca más alta

  • Hay N vacas en fila, y las formaciones son 1, 2, 3 ... N, y la altura de cada vaca es un número entero.
    Las dos vacas pueden verse si y solo si la altura de la vaca en el medio de las dos vacas es más corta que ellas.
    Ahora, solo sabemos que la vaca más alta es la cabeza P, su altura es H y se desconoce la altura de las vacas restantes.
    Sin embargo, también sabemos que hay M pares de relaciones en este rebaño de ganado. Cada par de relaciones indica que dos vacas A y B pueden verse.
    ¿Cuál es el valor máximo posible de la altura de cada vaca?
    Formato de
    entrada Introduzca los números enteros N, P, H, M en la primera línea y los datos están separados por espacios.
    En las siguientes M líneas, cada línea genera dos números enteros A y B, lo que representa que la vaca A y la vaca B pueden verse, y los datos están separados por espacios.
    Formato de salida Se
    emite un total de N líneas de datos y cada línea genera un número entero.
    La salida entera en la i-ésima línea representa la altura máxima posible de la i-ésima vaca.

Rango de datos
1≤N≤10000,
1≤H≤1000000
, 1≤A,
B≤10000 , 0≤M≤10000

Muestra de entrada:
9 3 5 5
1 3
5 3
4 3
3 7
9 8
Muestra de salida:
5
4
5
3
4
4
5
5
5
Nota:
El par de relaciones dado en esta pregunta puede estar duplicado

/*

因为这题中除最高的牛已知身高,其余的身高均未知。所以可以假设所有的牛与最高的牛身高相同。假设均为 h 
1、朴素方法:
开一个数组并初始化全为身高为h的牛。给出一对关系(i , j)表示牛i与牛j可以相互看到,即中间的牛严格比i和j小。
若此前未给出(i, j)的关系对,即将(i , j)中间的牛[i + 1 ~ j - 1] - 1
复杂度分析:若给出 M 个关系对,平均处理长度为 N。处理牛的复杂度O(N), O(N * M)

2、差分序列:
使用一个差分数组处理, 在朴素方法上处理中间牛的方法简化,只需要在c[i + 1]上加1,c[j]减一。
则可以达到(i , j)中间的牛[i + 1 ~ j - 1] - 1 的同样效果。
复杂度分析:若给出 M 个关系对,平均处理长度为 N 。处理牛的复杂度O(1), O(M)

*/

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;

const int N = 10010;//牛的最多多少个
int c[N];//牛的差分序列
map<pair<int,int>, bool>existed;//判断关系对是否存在重复

int main(){
    
    
    int n, p, h, m;
    cin >> n >> p >> h >> m;
    memset(c, 0, sizeof(c));
    for(int i = 1; i <= m; i++){
    
    
        int a, b;
        cin >> a >> b;
        if(a > b)swap(a , b);//保证a比b小,即(a, b)是有效的
        if(existed[make_pair(a, b)])continue;//若关系对之前已判断则不需要再处理
        c[a + 1]--, c[b]++;//处理c[i + 1 ~ j - 1]的牛
        existed[make_pair(a, b)] = true;
    }
    for(int i = 1; i <= n; i++){
    
    
        c[i] += c[i - 1];
        cout << h + c[i] << endl;
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45830383/article/details/108680223
Recomendado
Clasificación