最高的牛 (差分 字首和)

2021-10-05 15:33:46 字數 1349 閱讀 2937

有 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 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 ...