题目大意就是有n个奶牛排成一排,他们的身高都是正整数,从1到n编号,最高的奶牛是第I个,高度为H。给出r个信息,每个信息为“a号牛能看到b号牛”,即a+1号到b-1号牛都比a号牛和b号牛低,要求求出每个奶牛可能的最高身高。

朴素的算法可以模拟每一个信息,让a+1号到b-1号牛的身高都减一,时间复杂度为O(nr),显然会TLE。
这时我们会想到用差分来把区间操作简化为单点操作。用d数组来存差分的话,每个信息的操作就变成了d[a+1]-1,
d[b]+1,而第i号牛的身高与最高身高的差距就是d数组前i位的和。
代码如下

#include<iostream>
#include<cstdio>
using namespace std;
int d[10010];
bool f[10010][10010];
int main()
{
    ios::sync_with_stdio(false);
    int n,m,h,r;
    cin>>n>>m>>h>>r;
    for(int i=0;i<r;++i)
    {
        int a,b;
        cin>>a>>b;
        if(a>b)
            swap(a,b);
        if(f[a][b])
            continue;
        d[a+1]--;
        d[b]++;
        f[a][b]=true;
    }
    int sum=h;
    for(int i=1;i<=n;++i)
    {
        sum+=d[i];
        cout<<sum<<endl;
    }
    return 0;
}