1. 程式人生 > >1277. 最高的奶牛 (Standard IO)

1277. 最高的奶牛 (Standard IO)

Description

FJ有N(1 <= N <= 10,000)頭奶牛,編號為1到N,站成一條直線。每頭奶牛自己的身高(正整數,祕密未知),告訴你最高奶牛的身高H及位置I,同時告訴你R(0 <= R <= 10,000)組資訊,每組資訊由兩個數ai,bi組成,表示奶牛ai可以看到奶牛bi,這就意味著奶牛bi的身高至少和奶牛ai的身高一樣高,同時奶牛ai到奶牛bi之間的奶牛身高必須低於奶牛ai
現在要你求出每頭奶牛最高可能的高度,保證有解。

Input

第1行輸入4個空格隔開的整數N,I,H,R
第2到R+1行,每行兩個空格隔開的不同的整數A,B(1<=A,B<=N),表示奶牛A能看到奶牛B
解釋:如果奶牛A和奶牛B一樣高,則可以出現A看到B,B又看到A的情況,如果奶牛A矮於奶牛B,則只可能出現奶牛A看到奶牛B,奶牛B不可能看到奶牛A。

Output

第1到N行,每行一個整數表示每隻奶牛最高可能的高度。

Sample Input

9 3 5 5
1 3
5 3
4 3
3 7
9 8

Sample Output

5
4
5
3
4
4
5
5
5

思路

O(n^2)
暴力,一開始全部高度是最高高度,每輸入a看見b,那麼如果a和b之間所有奶牛有一頭比a高,那麼a與b之間所有奶牛全部減1。
var
  s:array[1..10000] of longint;
  n,i,h,r,j,k,x,y,p:longint;
begin
  readln(n,i,h,r);
  for i:=1 to n do
s[i]:=h; for i:=1 to r do begin readln(x,y); p:=x; if x>y then begin k:=x;x:=y;y:=k;end; for j:=x+1 to y-1 do if s[j]>=s[p] then begin for k:=x+1 to y-1 do dec(s[k]); break; end; end
; for i:=1 to n do writeln(s[i]); end.