【poj3263】 Tallest Cow
http://poj.org/problem?id=3263 (题目链接)
题意
n头奶牛排成一排,最高的一头I身高H,给出R个条件(a,b),表示a,b之间的奶牛都要比a矮,b的身高大于等于a。求每头奶牛最高能有多高。
Solution
差分确实很方便,这样就省去了线段树或者树状数组,而且时间复杂度也少了个log。
考虑对于每个条件(a,b),位于a,b之间的奶牛的身高最多也就是a-1,所以我们将区间[a-1,b-1]全部减去1,然后差分即可。
细节
注意会有重复,所以还要排个序去重。。幸好看了Discuss。
代码
// poj3263 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #define inf 2147483640 #define Pi acos(-1.0) #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); using namespace std; const int maxn=10010; struct data {int l,r;}t[maxn]; int a[maxn]; bool cmp(data a,data b) { return a.l==b.l ? a.r<b.r : a.l<b.l; } int main() { int n,I,H,r; scanf("%d%d%d%d",&n,&I,&H,&r); for (int i=1;i<=r;i++) scanf("%d%d",&t[i].l,&t[i].r); sort(t+1,t+1+r,cmp); int tot=0; for (int i=1;i<=r;i++) { if (t[tot].l==t[i].l && t[tot].r==t[i].r) continue; t[++tot]=t[i]; } r=tot; for (int i=1;i<=r;i++) { if (t[i].l<t[i].r-1) a[t[i].l+1]--,a[t[i].r]++; else if (t[i].l>t[i].r+1) a[t[i].r+1]--,a[t[i].l]++; } int x=H; for (int i=1;i<=n;i++) { x+=a[i]; if (i==I) printf("%d\n",H); else printf("%d\n",x); } return 0; }
This passage is made by MashiroSky.