题目链接:http://poj.org/problem?id=3263
考虑牛与牛之间的相对身高。
l,r能相互看到,即l+1~r-1这些牛的最高身高是它们的身高-1,即相对身高h-=1。对一个区间每次-=1,可以用差分维护,d[l+1]-=1,d[r]+=1,最后前缀和还原。每头牛的h即为$h_{max}$-d[i]。
注意细节:1.相对关系可能多次出现。2.le不一定小于ri。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 const int N=10005; 6 int n,id,h,r; 7 int d[N]; 8 bool g[N][N]; 9 int main(){ 10 scanf("%d%d%d%d",&n,&id,&h,&r); 11 for(int i=1;i<=r;i++){ 12 int le,ri; 13 scanf("%d%d",&le,&ri); 14 if(le>ri) swap(le,ri); 15 if(g[le][ri]||le==ri) continue; 16 g[le][ri]=1; 17 d[le+1]-=1; d[ri]+=1; 18 } 19 for(int i=1;i<=n;i++) d[i]+=d[i-1]; 20 for(int i=1;i<=n;i++) printf("%d ",h+d[i]); 21 return 0; 22 }