1. 程式人生 > >【poj3263】Tallest Cow(差分陣列)

【poj3263】Tallest Cow(差分陣列)

problem

給出n頭牛的身高,和m對關係(a[i]與b[i]可以相互看見。即他們中間的牛都比他們矮)。已知最高的牛為第p頭,身高為h。

求每頭牛的身高最大可能是多少。

solution

計算牛的相對大小關係。
第p頭最高h,比他矮的最高一定是h-1,,,所以最後每頭牛的身高就是,’它比p小多少’+h。
直接減就好了,最後c[p]一定是0,(因為他是最高的嘛)

a[i]與b[i]相互看見==他們中間的牛(a[i+1]到b[i-1])身高都比他們矮,於是把他們身高都減去1即可。關於區間修改,維護差分數列

注意坑點,輸入資料可能有重複以及可能位置順序不對。

codes

#include<iostream>
#include<algorithm> #include<map> using namespace std; const int maxn = 10010; map<pair<int,int>, bool>existed; int c[maxn], d[maxn]; int main(){ int n, p, h, m; cin>>n>>p>>h>>m; for(int i = 1; i <= m; i++){ int a, b; cin>>a>>b; if
(a > b)swap(a, b); if(existed[make_pair(a,b)])continue; d[a+1]--; d[b]++; existed[make_pair(a,b)] = 1; } for(int i = 1; i <= n; i++){ c[i] = c[i-1]+d[i]; cout<<h+c[i]<<'\n'; } return 0; }