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;
}