有 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 51 35 3
4 33 7
9 8
545注意:3445
55
此題中給出的關係對可能存在重複
思路:這道題意思就是先給你乙個最高的牛的身高,然後再給出幾組牛,兩兩能
相互看到,ab兩兩能相互看到就是指中間的牛的身高都比這兩個牛的身高低,我
們相求每個牛的最大身高,那麼中間的牛的身高我們就看做比ab矮1,因此我們
可以可以利用區間處理小操作,也就是字首和加差分。設乙個陣列d,d[i]
為比 最高牛矮多少,則d[p]=0,那麼對於一組關係,我們可以這樣操作,
d[a+1]--,d[b]++;然後從左到右字首和,就可以求出矮多少。具體可以看**實
現。
#include
using
namespace std;
#define ll long long
map,ll> q;
ll n,m,i,j,k,p,h,c[
10100
],d[
10100];
intmain()
}for
(i=1
;i<=n;i++
) c[i]
=c[i-1]
+d[i]
;for
(i=1
;i<=n;i++
) cout<
+h<
}
差分 最高的牛
最高的牛 有 n 頭牛站成一行,被編隊為1 2 3 n,每頭牛的身高都為整數。當且僅當兩頭牛中間的牛身高都比它們矮時,兩頭牛方可看到對方。現在,我們只知道其中最高的牛是第 p 頭,它的身高是 h 剩餘牛的身高未知。但是,我們還知道這群牛之中存在著 m 對關係,每對關係都指明了某兩頭牛 a 和 b 可...
演算法競賽高階指南 最高的牛(差分 字首和)
有 n 頭牛站成一行,被編隊為1 2 3 n,每頭牛的身高都為整數。當且僅當兩頭牛中間的牛身高都比它們矮時,兩頭牛方可看到對方。現在,我們只知道其中最高的牛是第 p 頭,它的身高是 h 剩餘牛的身高未知。但是,我們還知道這群牛之中存在著 m 對關係,每對關係都指明了某兩頭牛 a 和 b 可以相互看見...
字首和 差分
數列的字首和 sum i 表示a 1 a i 的和 用處1 求i j的和sum j sum i 1 用處2 區間修改。設定乙個change陣列。當區間 i,j 上要加k時,我們令change i k,令change j 1 k。如果我們對change陣列求字首和的話,字首和sum change i ...