题目描述
有 头牛站成一行。两头牛能够相互看见,当且仅当它们中间的牛身高都比它们矮。现在,我们只知道其中最高的牛是第 头,它的身高是 ,不知道剩余 头牛的身高,但是,我们还知道 对关系,每对关系都指明了某两头牛 和 可以相互看见。求每头牛的身高最大可能是多少。 , 。
算法分析
首先,我们将最高的牛的身高看为
,每头牛的初始身高也是
,然后每获得一对关系
,我们就将
内的身高都减去
,最后再将所有牛的身高都加上
,输出答案即可。
由于给出的方案不存在交叉,即
,所以上述做法不会出现问题,需要注意的是判断一对关系是否多次输入,如果有多次输入,处理一次即可。
代码实现
#include <cstdio>
#include <set>
#include <utility>
#include <algorithm>
typedef std::pair<int,int> P;
int arr[10005];
std::set<P> s;
int main() {
int n,i,h,r;
scanf("%d%d%d%d",&n,&i,&h,&r);
arr[1]+=h;arr[n+1]-=h;
int a,b;
while(r--) {
scanf("%d%d",&a,&b);
int x=std::min(a,b),y=std::max(a,b);
if(s.count(P(x,y))) continue;
s.insert(P(x,y));
arr[x+1]+=-1;arr[y]-=-1;
}
int now=0;
for(int i=1;i<=n;++i) printf("%d\n",now+=arr[i]);
return 0;
}