有 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 55451 35 3
4 33 7
9 8
3445
55此題中給出的關係對可能存在重複
這道題會用到map和pair的一些小知識,大家可以了解一下,在這不過多闡述,貼出來兩篇寫的很好的部落格~
【c++ map用法總結】
【c++ pair的基本用法總結】
思路分析:這道題的重點就是如何處理讓兩頭牛能相互看見的問題。
首先我們可以想到要是兩頭牛能相互看到則要是兩頭牛中間的牛牛們的身高都要至少低1,而又要滿足中間的牛牛們的身高都最高,則只減1。
則我們可以開乙個d[i]陣列來表示第i頭牛比最高的牛矮多少; 然後對給出的關係(a,b)進行操作,讓d[a+1]–,d[b]++可以實現僅僅對區間內的牛們操作。
ac**:
#include
using
namespace std;
#define ll long long
map,ll> q;
ll n,p,h,m,i;
ll c[
10100
],d[
10100];
//d[i]表示第i頭牛比最高的牛矮多少;
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 可以相...
差分 最高的牛
最高的牛 有 n 頭牛站成一行,被編隊為1 2 3 n,每頭牛的身高都為整數。當且僅當兩頭牛中間的牛身高都比它們矮時,兩頭牛方可看到對方。現在,我們只知道其中最高的牛是第 p 頭,它的身高是 h 剩餘牛的身高未知。但是,我們還知道這群牛之中存在著 m 對關係,每對關係都指明了某兩頭牛 a 和 b 可...