POJ 3263 Tallest Cow(差分)

题目链接: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 }
AC代码
原文地址:https://www.cnblogs.com/New-ljx/p/13658497.html