题目链接:http://poj.org/problem?id=3263
题目大意:有 (N) 头牛,最高的是第 (I) 头,身高是 (H) ,现在有 (R) 组相对关系。每组相对关系有两个数 (A) 和 (B),表示 (A) 和 (B) 能相互看见,也就是他们中间的牛都比他俩矮。输出所有牛的最大的可能身高。
解题思路:
(A) 和 (B) 可以相互看见,其实就是 ([A+1,B-1]) 区间的牛都比他俩低,也就是我们把这个区间的值都减去 (1) 即可。
定义一个差分数组 (d),令 (d[A+1] -= 1, d[B] += 1) 即可。
坑点:相对关系可能会重复的给你,所以要判重。
示例代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
const int maxn = 10010;
int n, I, H, R, a, b, h[maxn], d[maxn]; // d[]差分数组
set<pair<int, int> > st;
int main() {
while (~scanf("%d%d%d%d", &n, &I, &H, &R)) {
memset(h, 0, sizeof(int)*(n+1));
while (R --) {
scanf("%d%d", &a, &b);
if (a > b) swap(a, b);
if (st.count(make_pair(a, b))) continue;
st.insert(make_pair(a, b));
d[a+1] --;
d[b] ++;
}
for (int i = 1; i <= n; i ++) h[i] = h[i-1] + d[i];
for (int i = 1; i <= n; i ++) {
printf("%d
", h[i] + H - h[I]);
}
}
return 0;
}