AcWing 101. 最高的牛(差分)
阿新 • • 發佈:2021-07-21
題目
有 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進行去重。
作者:inss!w! 出處:https://www.cnblogs.com/Hfolsvh/ 版權宣告:本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!#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; } }