1. 程式人生 > >Tallest Cow【poj3263】

Tallest Cow【poj3263】

有n頭牛,告訴了你最高的牛的位置和身高,並告訴你m個關係,a到b之間的牛都比a和b矮,求每頭牛的最大身高。

因為要求的是每頭牛可能的最大身高,所以a,b之間的牛最高比a,b矮1,我們可以用一個數組,來記錄這個身高差距。每次a到b之間的c[i]減一,最後的答案就是最高的牛的身高H-c[i]。但直接修改c陣列的時間複雜度是nm的,這是我們可以差分一下,開一個d陣列,d[a+1]-1,d[b]+1,這樣c陣列就可以用d陣列的字首和來表示。

ps.這道題還要判重,因為poj的記憶體給的小,所以要用到map。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
int n,p,H,m,x,y,d[10035],c[10035];
map<pair<int,int>, bool>xy;
int main()
{
	scanf("%d%d%d%d",&n,&p,&H,&m);
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		if (x>y) swap(x,y);
		if (xy[make_pair(x,y)]) continue;
		d[y]++;
		d[x+1]--;
		xy[make_pair(x,y)]=true;
	}
	for (int i=1;i<=n;i++)
		c[i]=c[i-1]+d[i];
	c[p]=0;
	for (int i=1;i<=n;i++)
		printf("%d\n",H+c[i]);
}