Tallest Cow(最高的牛)Acwing101 —— 前缀和、差分

最高的牛(Tallest Cow)

  • 有 N 头牛站成一行,被编队为1、2、3…N,每头牛的身高都为整数。
    当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方。
    现在,我们只知道其中最高的牛是第 P 头,它的身高是 H ,剩余牛的身高未知。
    但是,我们还知道这群牛之中存在着 M 对关系,每对关系都指明了某两头牛 A 和 B 可以相互看见。
    求每头牛的身高的最大可能值是多少。
    输入格式
    第一行输入整数N,P,H,M,数据用空格隔开。
    接下来M行,每行输出两个整数 A 和 B ,代表牛 A 和牛 B 可以相互看见,数据用空格隔开。
    输出格式
    一共输出 N 行数据,每行输出一个整数。
    第 i 行输出的整数代表第 i 头牛可能的最大身高。

数据范围
1≤N≤10000,
1≤H≤1000000,
1≤A,B≤10000,
0≤M≤10000

输入样例:
9 3 5 5
1 3
5 3
4 3
3 7
9 8
输出样例:
5
4
5
3
4
4
5
5
5
注意:
此题中给出的关系对可能存在重复

/*

因为这题中除最高的牛已知身高,其余的身高均未知。所以可以假设所有的牛与最高的牛身高相同。假设均为 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;
}

猜你喜欢

转载自blog.csdn.net/qq_45830383/article/details/108680223
今日推荐