USACO2007月赛银组的一道题目,比较简单。

题目描述:
有N头奶牛,已知最高奶牛的身高H和它的编号I。
给出R个限制,每个限制给出一对数{A,B}表示A能看到B,这里的能看到表示B和至少一样高(有可能B比A高),并且[A,B]中间的奶牛高度都要比A和B矮。
问这些奶牛最高的可能身高。
思路:
要让奶牛身高尽量高。那么对于某个纸条A->B来说,我们只希望[A+1,B-1]范围内的奶牛高度只比A和B低1。那么我们可以得到一个朴素算法,对于每次的纸条A->B,我们令[A+1,B-1]的奶牛高度都-1。这样我们可以保证最后得到的结果是尽量高的。复杂度是O(n^2)。
考虑到n最大为10000,O(n^2)的算法有点危险。实际上我们可以进行优化。对某个区间同时加法或减法,显然可以用差分数组。复杂度降到O(n)。
注意题目说了可能有重复的约束,所以要判重。可以用bitset或者map

代码:

#include<bits/stdc++.h>
using namespace std;
int N,I,H,R,b[10030];
bitset<100004000>v;
int main()
{
    cin>>N>>I>>H>>R;
    while(R--){
        int A,B;
        cin>>A>>B;
        if(A>B)swap(A,B);
        if(v[A*10000+B])continue;
        v[A*10000+B]=1;
        b[A+1]--;b[B]++;
    }
    for(int i=0;i<=N;i++)b[i]+=b[i-1];
    for(int i=1;i<=N;i++)b[i]+=H,cout<<b[i]<<endl;
    return 0;
}