1. 程式人生 > 其它 >AcWing 101. 最高的牛(差分)

AcWing 101. 最高的牛(差分)

題目

有 N 頭牛站成一行,被編隊為 1、2、3…N,每頭牛的身高都為整數。
當且僅當兩頭牛中間的牛身高都比它們矮時,兩頭牛方可看到對方。
現在,我們只知道其中最高的牛是第 P 頭,它的身高是 H ,剩餘牛的身高未知。
但是,我們還知道這群牛之中存在著 M 對關係,每對關係都指明瞭某兩頭牛 A 和 B 可以相互看見。
求每頭牛的身高的最大可能值是多少。

輸入輸出

輸入:第一行輸入整數 N,P,H,M,資料用空格隔開。
接下來 M 行,每行輸出兩個整數 A 和 B ,代表牛 A 和牛 B 可以相互看見,資料用空格隔開。
此題中給出的關係對可能存在重複
輸出:一共輸出 N 行資料,每行輸出一個整數。
第 i 行輸出的整數代表第 i 頭牛可能的最大身高。

思路

n頭牛的身高先初始化為最高牛的身高,n頭牛一開始都一樣高。
假設a、b兩頭牛可以相互看到,說明a、b中間的都比它們矮,a、b中間的身高-1。可以證明能相互看到的區間不會重合。
在某一段區間加上一個數是差分的應用。height[N]是差分陣列。
為了讓所有牛的身高都為h,height[0]初始化為h,其他都為0,用字首和將height相加就能得到所有牛的身高。
當a、b可以下相互看到,height[a+1]--並且height[b]++,會得到a和b之間的牛身高都-1。
注:題目中的關係對可能會重複,重複的關係不需要重複減一,因為需要STL容器set進行去重。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>

using namespace std;

const int N = 100010;
int height[N];

int main()
{
    int n,p,h,m;
    cin >> n >> p >> h >> m;
    set<pair<int,int>>existed;  //取出重複的關係
    height[0] = h;
    for (int i = 0; i < m; i ++ ){
        int a,b;
        cin >> a >> b;
        if(a > b) swap(a,b);    //調整a、b大小關係
        if(!existed.count({a,b})){
            existed.insert({a,b});
            height[a+1]--;height[b]++;
        }
    }
    for (int i = 1; i <= n; i ++ ){
        height[i] += height[i-1];
        cout << height[i] << endl;
    }
}
作者:inss!w! 出處:https://www.cnblogs.com/Hfolsvh/ 版權宣告:本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!