【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
",H);
		else printf("%d
",x);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/MashiroSky/p/5942914.html