POJ3263 Tallest Cow 题解 差分数组
题目链接: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\n", h[i] + H - h[I]);
}
}
return 0;
}