Tallest Cow【poj3263】
阿新 • • 發佈:2018-12-17
有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]); }