题目描述
有 NN 头牛站成一行。两头牛能够相互看见,当且仅当它们中间的牛身高都比它们矮。现在,我们只知道其中最高的牛是第 头,它的身高是 HH,不知道剩余 头牛的身高,但是,我们还知道 RR 对关系,每对关系都指明了某两头牛 和 BiBi 可以相互看见。求每头牛的身高最大可能是多少。1≤N,R≤1041≤N,R≤104,1≤H≤1061≤H≤106。
算法分析
首先,我们将最高的牛的身高看为 00,每头牛的初始身高也是 ,然后每获得一对关系 Ai,BiAi,Bi,我们就将 [Ai+1,Aj−1][Ai+1,Aj−1] 内的身高都减去 11,最后再将所有牛的身高都加上 ,输出答案即可。
由于给出的方案不存在交叉,即 Ai≤Ak<Aj≤AlAi≤Ak<Aj≤Al,所以上述做法不会出现问题,需要注意的是判断一对关系是否多次输入,如果有多次输入,处理一次即可。
代码实现
#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;
}