1. 程式人生 > >Tallest Cow POJ - 3263

Tallest Cow POJ - 3263

FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with the index I of that cow.

FJ has made a list of R (0 ≤ R ≤ 10,000) lines of the form "cow 17 sees cow 34". This means that cow 34 is at least as tall as cow 17, and that every cow between 17 and 34 has a height that is strictly smaller than that of cow 17.

For each cow from 1..N, determine its maximum possible height, such that all of the information given is still correct. It is guaranteed that it is possible to satisfy all the constraints.

Input

Line 1: Four space-separated integers: N, I, H and R
Lines 2.. R+1: Two distinct space-separated integers A
and B (1 ≤ A, BN), indicating that cow A can see cow B.

Output

Lines 1.. N: Line i contains the maximum possible height of cow i.

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


題意:n頭牛 第i個牛最高,高度為h
然後有r個關係 說明這個關係中的兩頭牛相互看的見(他們中間的牛高度比他們矮)
求所有牛最大可能的高度

思路:
1、既然給出每個關係中x、y兩頭牛相互可以看見,那麼他們之間的牛的高度肯定比他要矮,所以每次給出x、y,我們只需要將x+1到y-1的牛高度全部-1,這樣最後就知道了他們之間的最小高度差,
再把每個cow【i】+h O(NR)
2、我們可以優化一下,就是說給你x、y兩頭牛,你在x+1的位置-1,再y的位置+1,這樣我們就記錄了這個關係,你從x遍歷到y,讓cow【i】+=cow【i-1】,你會發現,他每個x+1到y-1都是-1而x、y則是0,
我們可以把所有的關係先記錄下來,然後遍歷(cow【i】+h)就可以知道他們之間的最小高度差,然後cow【i】+h O(N+R)

坑點:記得去重
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<map>
 4 using namespace std;
 5 typedef pair<int,int> P;
 6 const int maxn = 1e4+4;
 7 int n,i,h,r;
 8 int ans[maxn];
 9 map<P,int>mp;
10 int main()
11 {
12     scanf("%d%d%d%d",&n,&i,&h,&r);
13     for(int i=1;i<=r;i++)
14     {
15         int x,y;
16         scanf("%d%d",&x,&y);
17         if(x > y)swap(x,y);
18         if(mp[P(x,y)])continue;
19         mp[P(x,y)]=1;
20         for(int j=x+1;j<y;j++)
21         {
22             ans[j]--;
23         }
24 
25     }
26     for(int i=1;i<=n;i++)
27     {
28         printf("%d\n",ans[i]+h);
29     }
30 }
View Code
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<map>
 4 using namespace std;
 5 typedef pair<int,int> P;
 6 const int maxn = 1e4+4;
 7 int n,i,h,r;
 8 int ans[maxn];
 9 map<P,int>mp;
10 int main()
11 {
12     scanf("%d%d%d%d",&n,&i,&h,&r);
13     for(int i=1;i<=r;i++)
14     {
15         int x,y;
16         scanf("%d%d",&x,&y);
17         if(x > y)swap(x,y);
18         if(mp[P(x,y)])continue;
19         mp[P(x,y)]=1;
20         ans[x+1]--;
21         ans[y]++;
22     }
23     for(int i=1;i<=n;i++)
24     {
25         ans[i] += ans[i-1];
26         printf("%d\n",ans[i]+h);
27     }
28 }
View Code